lmer错误:分组因素必须小于观测次数。

5

我正在尝试对一些数据运行混合效应模型,但在处理其中一个固定效应时遇到了困难,我认为主要是因为它是一个因子?!

样本数据:

data4<-structure(list(code = structure(1:10, .Label = c("10888", "10889", 
"10890", "10891", "10892", "10893", "10894", "10896", "10897", 
"10898", "10899", "10900", "10901", "10902", "10903", "10904", 
"10905", "10906", "10907", "10908", "10909", "10910", "10914", 
"10916", "10917", "10919", "10920", "10922", "10923", "10924", 
"10925", "10927"), class = "factor"), speed = c(0.0296315046039244, 
0.0366986630049636, 0.0294297725505692, 0.048316183511095, 0.0294275666501456, 
0.199924957584131, 0.0798850288176711, 0.0445886457047146, 0.0285993712316451, 
0.0715158276875623), meanflow = c(0.657410742496051, 0.608271363339857, 
0.663241108786611, 0.538259450171821, 0.666299529534762, 0.507156583629893, 
0.762448863636364, 37.6559178370787, 50.8557196935557, 31.6601587837838
), length = c(136, 157, 132, 140, 135, 134, 144, 149, 139, 165
), river = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L
), .Label = c("c", "f"), class = "factor")), .Names = c("code", 
"speed", "meanflow", "length", "river"), row.names = c(2L, 4L, 
6L, 8L, 10L, 12L, 14L, 16L, 18L, 20L), class = "data.frame")

我的模型如下:

model1<-lmer(speed ~ river + length +(1|meanflow)+(1|code), data4)

当运行时返回错误信息:

Error in checkNlevels(reTrms$flist, n = n, control) : 
number of levels of each grouping factor must be < number of observations

在搜索了整个互联网后,我找到了一个回答

但是我真的不理解这个问题的回答!

2个回答

14

你这里有两个问题:

  • 看起来每个code值都有一个观察值。这意味着你无法同时估计残差方差(内置于lmer和线性混合模型中)和code间的方差。这两个参数都将尝试估计相同的方差分量,而任何加起来等于同一数值的var(residual)var(code)的组合将代表数据的同等拟合度。

  • 每个meanflow值也有一个观察值;这是因为meanflow是连续变量,通常不应该用作模型中的分组变量。我不确定你想要捕捉什么信息。

如果坚持拟合这些模型,可以使用lmerControl来绕过检查,但结果未必合理!

model2 <- lmer(speed ~ river + length +(1|meanflow)+(1|code), data4,
    control=lmerControl(check.nobs.vs.nlev = "ignore",
     check.nobs.vs.rankZ = "ignore",
     check.nobs.vs.nRE="ignore"))

这里方差已经被大致平均分成三等份:

 VarCorr(model2)
 ##  Groups   Name        Std.Dev.
 ##  meanflow (Intercept) 0.035354
 ##  code     (Intercept) 0.032898
 ##  Residual             0.033590

如果我们只使用一个(仍然不适当的)随机效应,

model0 <- lmer(speed ~ river + length +(1|meanflow), data4,
    control=lmerControl(check.nobs.vs.nlev = "ignore",
     check.nobs.vs.rankZ = "ignore",
     check.nobs.vs.nRE="ignore"))

现在方差被平分为两半:

VarCorr(model0)
##  Groups   Name        Std.Dev.
##  meanflow (Intercept) 0.041596
##  Residual             0.041596

好的,现在我明白了它是如何工作的,我可以放弃模型中的“code”部分。通过将“meanflow”作为随机效应,我希望能够从模型中消除由“mean flow”引起的变异,以便评估“river”和“length”的直接影响。 - Salmo salar
只需将 meanflow 作为固定效应即可。 - Ben Bolker

-3
你可以使用minque包,一个用于线性混合模型的R包,来解决你的问题:
  library(minque)
  OUT<-lmm(speed ~ river + length+1|meanflow+code,method=c("reml"),data=data4)
  OUT[[1]]$Var
  OUT[[1]]$FixedEffect
  OUT[[1]]$RandomEffect

有时候lme4无法拟合某些模型。

我不喜欢这个答案,因为它忽略了模型公式存在问题这一事实。 - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接