【问题标题】:lmer error: grouping factor must be < number of observationslmer 错误:分组因子必须是 < 观察次数
【发布时间】:2013-10-31 17:39:43
【问题描述】:

我正在尝试对一些数据运行混合效应模型,但在其中一个固定效应上苦苦挣扎,我认为主要是因为它是一个因素?!

样本数据:

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

我在网上搜索了found one response

但是对于我的生活,我不明白对问题的回答!

【问题讨论】:

    标签: r lme4 mixed-models nlme


    【解决方案1】:

    这里有两个问题:

    • 看起来您对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
    

    【讨论】:

    • 好的,我现在可以删除模型的“代码”部分,我了解它是如何工作的。通过将“平均流量”作为随机效应,我希望这可以消除模型中“平均流量”引起的变化,从而可以评估“河流”和“长度”的直接影响。
    • 我认为只需将meanflow 包含为固定效果。
    【解决方案2】:

    您可以使用 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 无法适应某些模型。

    【讨论】:

    • 我不喜欢这个答案,因为它忽略了模型公式有问题的事实。
    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多