lmer 模型和 lsmeans 输出错误
Error in lmer model and lsmeans output
我是 运行 使用 lme4
包的 LME 模型,然后使用 lsmeans
包进行成对比较。
这是我的代码:
lmer_full <- lmer (VOT ~ Place*Laryngeal + (1+Place+Laryngeal|Sp),
data = LME,control=lmerControl(optCtrl=list(maxfun=50000)))
lsmeans (lmer_full, pairwise~Laryngeal|Place)
但是,我在 运行 lmer
之后收到以下错误消息:
fixed-effect model matrix is rank deficient so dropping 1 column / coefficient
Warning messages:
1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
unable to evaluate scaled gradient
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge: degenerate Hessian with 1 negative eigenvalues
然后 运行 lsmeans
之后的另一个错误:
Error in base::chol2inv(x, ...) : 'a'
must be a numeric matrix
这是我的数据结构:
如果有人能告诉我这个模型有什么问题,我将不胜感激。
tl;dr 我无法完全重现您的错误,但我可以非常接近。您的数据集很可能也 small/noisy 适合您想要拟合的模型(您得到的是单一模型);使用 emmeans
包(lsmeans
的后继包)会有所帮助,但您可能应该简化模型。
- 从一个大的、完全交叉的数据集开始:
library(lme4)
library(emmeans)
dd <- expand.grid(Place=factor(1:3),Laryngeal=factor(1:3),
Sp=factor(1:10),rep=6)
set.seed(101)
dd$y <- rnorm(nrow(dd))
This works fine:
m1 <- lmer(y~Place*Laryngeal + (1+Place+Laryngeal|Sp), dd)
emmeans(m1,pairwise~Laryngeal|Place) ## lsmeans() also works
- 减少数据集(删除一个水平组合)会导致 "fixed-effect model matrix is rank deficient" 消息,但一切正常:
dd_missing <- subset(dd,!(Place=="2" & Laryngeal=="2"))
m2 <- update(m1, data=dd_missing)
emmeans(m2,pairwise~Laryngeal|Place) ## lsmeans() also works
- 如果我们随机对一小部分数据进行二次抽样,我们可能会得到错误,尽管我无法在不告诉
lmer
忽略数据集的其他一些问题的情况下对我的数据执行此操作(不是对于指定的随机效应数量足够的样本):
set.seed(102)
dd_small <- dd_missing[sample(1:nrow(dd_missing),
size=round(nrow(dd_missing)*0.3),
replace=FALSE),]
m3 <- update(m1, data=dd_small,
control=lmerControl(check.nobs.vs.nlev="ignore",
check.nobs.vs.nRE="ignore",
optCtrl=list(maxfun=50000)))
emmeans(m3,pairwise~Laryngeal|Place) ## works (sort of)
lsmeans::lsmeans(m3,pairwise~Laryngeal|Place) ## fails
- 最后,简化模型让事情变得更好:
m4 <- update(m3, . ~ Place*Laryngeal + (1+Place|Sp))
emmeans(m4,pairwise~Laryngeal|Place)
lsmeans::lsmeans(m4,pairwise~Laryngeal|Place)
我是 运行 使用 lme4
包的 LME 模型,然后使用 lsmeans
包进行成对比较。
这是我的代码:
lmer_full <- lmer (VOT ~ Place*Laryngeal + (1+Place+Laryngeal|Sp),
data = LME,control=lmerControl(optCtrl=list(maxfun=50000)))
lsmeans (lmer_full, pairwise~Laryngeal|Place)
但是,我在 运行 lmer
之后收到以下错误消息:
fixed-effect model matrix is rank deficient so dropping 1 column / coefficient
Warning messages:
1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, : unable to evaluate scaled gradient
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, : Model failed to converge: degenerate Hessian with 1 negative eigenvalues
然后 运行 lsmeans
之后的另一个错误:
Error in
base::chol2inv(x, ...) : 'a'
must be a numeric matrix
这是我的数据结构:
如果有人能告诉我这个模型有什么问题,我将不胜感激。
tl;dr 我无法完全重现您的错误,但我可以非常接近。您的数据集很可能也 small/noisy 适合您想要拟合的模型(您得到的是单一模型);使用 emmeans
包(lsmeans
的后继包)会有所帮助,但您可能应该简化模型。
- 从一个大的、完全交叉的数据集开始:
library(lme4)
library(emmeans)
dd <- expand.grid(Place=factor(1:3),Laryngeal=factor(1:3),
Sp=factor(1:10),rep=6)
set.seed(101)
dd$y <- rnorm(nrow(dd))
This works fine:
m1 <- lmer(y~Place*Laryngeal + (1+Place+Laryngeal|Sp), dd)
emmeans(m1,pairwise~Laryngeal|Place) ## lsmeans() also works
- 减少数据集(删除一个水平组合)会导致 "fixed-effect model matrix is rank deficient" 消息,但一切正常:
dd_missing <- subset(dd,!(Place=="2" & Laryngeal=="2"))
m2 <- update(m1, data=dd_missing)
emmeans(m2,pairwise~Laryngeal|Place) ## lsmeans() also works
- 如果我们随机对一小部分数据进行二次抽样,我们可能会得到错误,尽管我无法在不告诉
lmer
忽略数据集的其他一些问题的情况下对我的数据执行此操作(不是对于指定的随机效应数量足够的样本):
set.seed(102)
dd_small <- dd_missing[sample(1:nrow(dd_missing),
size=round(nrow(dd_missing)*0.3),
replace=FALSE),]
m3 <- update(m1, data=dd_small,
control=lmerControl(check.nobs.vs.nlev="ignore",
check.nobs.vs.nRE="ignore",
optCtrl=list(maxfun=50000)))
emmeans(m3,pairwise~Laryngeal|Place) ## works (sort of)
lsmeans::lsmeans(m3,pairwise~Laryngeal|Place) ## fails
- 最后,简化模型让事情变得更好:
m4 <- update(m3, . ~ Place*Laryngeal + (1+Place|Sp))
emmeans(m4,pairwise~Laryngeal|Place)
lsmeans::lsmeans(m4,pairwise~Laryngeal|Place)