R:在使用自构造的交互变量时,不能得到lme {nlme}

时间:2016-08-29 09:07:35

标签: r interaction mixed-models

我试图通过自构造的交互变量得到一个lme来适应。我需要那些用于事后分析。

library(nlme)

# construct fake dataset
obsr <- 100
dist <- rep(rnorm(36), times=obsr)
meth <- dist+rnorm(length(dist), mean=0, sd=0.5); rm(dist)
meth <- meth/dist(range(meth)); meth <- meth-min(meth)
main <- data.frame(meth = meth,
                   cpgl = as.factor(rep(1:36, times=obsr)),
                   pbid = as.factor(rep(1:obsr, each=36)),
                   agem = rep(rnorm(obsr, mean=30, sd=10), each=36),
                   trma = as.factor(rep(sample(c(TRUE, FALSE), size=obsr, replace=TRUE), each=36)),
                   depr = as.factor(rep(sample(c(TRUE, FALSE), size=obsr, replace=TRUE), each=36)))

# check if all factor combinations are present
# TRUE for my real dataset; Naturally TRUE for the fake dataset
with(main, all(table(depr, trma, cpgl) >= 1))

# construct interaction variables
main$depr_trma <- interaction(main$depr, main$trma, sep=":", drop=TRUE)
main$depr_cpgl <- interaction(main$depr, main$cpgl, sep=":", drop=TRUE)
main$trma_cpgl <- interaction(main$trma, main$cpgl, sep=":", drop=TRUE)
main$depr_trma_cpgl <- interaction(main$depr, main$trma, main$cpgl, sep=":", drop=TRUE)

# model WITHOUT preconstructed interaction variables
form1 <- list(fixd = meth ~ agem + depr + trma + depr*trma + cpgl +
                            depr*cpgl +trma*cpgl + depr*trma*cpgl,
              rndm = ~ 1 | pbid,
              corr = ~ cpgl | pbid)

modl1 <- nlme::lme(fixed=form1[["fixd"]],
                   random=form1[["rndm"]],
                   correlation=corCompSymm(form=form1[["corr"]]),
                   data=main)

# model WITH preconstructed interaction variables
form2 <- list(fixd = meth ~ agem + depr + trma + depr_trma + cpgl +
                            depr_cpgl + trma_cpgl + depr_trma_cpgl,
              rndm = ~ 1 | pbid,
              corr = ~ cpgl | pbid)

modl2 <- nlme::lme(fixed=form2[["fixd"]],
                   random=form2[["rndm"]],
                   correlation=corCompSymm(form=form2[["corr"]]),
                   data=main)

第一个模型没有任何问题,而第二个模型给出了以下错误:

Error in MEEM(object, conLin, control$niterEM) : 
  Singularity in backsolve at level 0, block 1

到目前为止,我没有发现任何关于此错误的信息,这有助于我解决问题。然而,解决方案可能非常简单。

有人能帮助我吗?提前谢谢!

编辑1:

当我跑步时:

modl3 <- lm(form1[["fixd"]], data=main)
modl4 <- lm(form2[["fixd"]], data=main)

总结显示,与modl3相比,modl4(具有自构建的交互变量)显示出更多的预测变量。所有那些在4但不在3中的人显示NA为系数。因此问题肯定在于我创建交互变量的方式......

编辑2:

与此同时,我手工创建了交互变量&#34;&#34; (主要是paste()grepl()) - 现在似乎有用了。但是,我仍然会对如何使用interaction()函数实现它感兴趣。

1 个答案:

答案 0 :(得分:1)

我应该只构建最大的交互变量(组合所有3个简单变量)。

如果我这样做,模型就会变得合适。那么可能性彼此非常接近,系数的数量完全匹配。