首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lmer错误:分组因子必须小于观察值

lmer错误:分组因子必须小于观察值
EN

Stack Overflow用户
提问于 2013-11-01 01:39:43
回答 2查看 27.9K关注 0票数 5

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

示例数据:

代码语言:javascript
复制
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")

我的模型是这样的:

代码语言:javascript
复制
model1<-lmer(speed ~ river + length +(1|meanflow)+(1|code), data4)

当run返回错误消息时:

代码语言:javascript
复制
Error in checkNlevels(reTrms$flist, n = n, control) : 
number of levels of each grouping factor must be < number of observations

在互联网上搜索过后,我有了found one response

但是对于生活中的我来说,这个问题的答案是不明白的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-01 03:52:42

这里有两个问题:

看起来你对code的每个值都有一个观察值。这意味着您不能同时估计残差方差(内置于lmer和更一般的线性混合模型中)和code间方差--这两个参数将尝试估计相同的方差分量,并且任何相加相同值的var(residual)var(code)的组合将表示与数据同样良好的拟合。

  • 对于meanflow的每个值也有一个观察值;这是因为meanflow是一个连续变量,通常您不希望将其用作模型中的分组变量。我不确定你想用这个术语表达什么。

如果您坚持使用lmerControl绕过检查,您实际上可以拟合这些模型,但您不一定会得到合理的结果!

代码语言:javascript
复制
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"))

在这里,方差被大致等分成三等分:

代码语言:javascript
复制
 VarCorr(model2)
 ##  Groups   Name        Std.Dev.
 ##  meanflow (Intercept) 0.035354
 ##  code     (Intercept) 0.032898
 ##  Residual             0.033590

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

代码语言:javascript
复制
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"))

现在方差被精确地一分为二:

代码语言:javascript
复制
VarCorr(model0)
##  Groups   Name        Std.Dev.
##  meanflow (Intercept) 0.041596
##  Residual             0.041596
票数 11
EN

Stack Overflow用户

发布于 2016-10-12 03:00:44

您可以使用线性混合模型的R包minque包来解决您的问题:

代码语言:javascript
复制
  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无法适应某些型号。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19713228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档