【问题标题】:non-conformable arguments error from lmer when trying to extract information from the model matrix尝试从模型矩阵中提取信息时,来自 lmer 的不符合参数错误
【发布时间】:2016-03-17 05:59:44
【问题描述】:

我有一些纵向数据,我想从中获得指定时间的预测均值。该模型包括 2 项,它们的交互作用和时间变量的样条项。当我尝试获得预测的平均值时,我得到“错误在 mm %*% fixef(m4) : non-conformable arguments”

我使用了 lmer 的睡眠数据集来说明我的问题。首先,我导入数据并为我的交互创建一个变量“年龄”

sleep <- as.data.frame(sleepstudy)  #get the sleep data
# create fake variable for age with 3 levels
set.seed(1234567)
sleep$age <- as.factor(sample(1:3,length(sleep),rep=TRUE))

然后我运行我的 lmer 模型

library(lme4)
library(splines)
m4 <- lmer(Reaction ~ Days + ns(Days, df=4) + age + Days:age + (Days | Subject), sleep) 

最后,我创建了获得预测均值所需的数据和矩阵

#new data frame for predicted means
d <- c(0:9)  # make a vector of days = 0 to 9 to obtain predictions for each day
newdat <- as.data.frame(cbind(Days=d, age=rep(c(1:3),length(d))))
newdat$Days <- as.numeric(as.character(newdat$Days))
newdat$age <- as.factor(newdat$age)

# create a matrix 
mm<-model.matrix(~Days + ns(Days, df=4) + age + Days:age, newdat)  
newdat$pred<-mm%*%fixef(m4) 

此时我得到了错误: mm %*% fixef(m4) 中的错误:参数不一致

我可以使用 predict 来获得手段

newdat$pred <- predict(m4, newdata=newdat, re.form=NA)

效果很好,但我希望能够计算置信区间,所以我需要一个一致的矩阵。

我在某处读到问题可能是 lmer 创建了别名(我找不到那个帖子)。此评论是关于无法将 effect() 用于类似任务的问题。我不太明白如何克服这个问题。此外,我记得那个帖子有点旧,希望别名问题可能不再相关。

如果有人对我可能做错的地方提出建议,我将不胜感激。谢谢。

【问题讨论】:

  • 在您给出的示例中,您会收到消息fixed-effect model matrix is rank deficient so dropping 1 column / coefficient。这意味着模型中的固定效应数量少于mm 中的数量,这就是您收到错误消息的原因
  • 是的,aosmith,我确实收到了这条信息。如果模型只包含样条,它就会消失;即:m4
  • 抱歉,更正,它在单变量(仅样条)模型中消失了,但无论如何该错误与样条的使用有关。
  • 你看我的回答了吗...?
  • 是的,@BenBolker,我确实读过它——我遇到了一些需要先解决的错误。我已经直接回复了你的回答。此外,我确定了这些示例数据中的 2 个奇怪之处,它们需要新的帖子,但为了完整起见,我在此注明:1)我认为使用种子每次都会产生相同的年龄水平,但奇怪的是,事实并非如此,因此您的评论“## 下一行恰好只采样 2 和 3 ...”; 2) 当因子变量使用字母顺序与编号顺序不同的标签时,predict 和此方法会给出不同的结果。

标签: lme4 splines model.matrix


【解决方案1】:

这里有几件事。

  • 您需要删除列以使您的模型矩阵与实际拟合的固定效应向量相称(即,与删除共线列后实际用于拟合的模型矩阵相称)
  • 为了进一步混淆,您碰巧只采样了 2 岁和 3 岁(可能的 {1,2,3})

我已经稍微清理了代码...

library("lme4")
library("splines")
sleep <- sleepstudy  #get the sleep data
set.seed(1234567)
## next line happens to sample only 2 and 3 ...
sleep$age <- as.factor(sample(1:3,length(sleep),rep=TRUE))
length(levels(sleep$age))  ## 2

拟合模型:

m4 <- lmer(Reaction ~ Days + ns(Days, df=4) +
    age + Days:age + (Days | Subject), sleep)
## message; fixed-effect model matrix is 
##    rank deficient so dropping 1 column / coefficient

检查固定效果:

f1 <- fixef(m4)
length(f1)  ## 7
f2 <- fixef(m4,add.dropped=TRUE)
length(f2)  ## 8

我们可以使用这个扩展版本的固定效果(其中有一个NA 值),但这只会让我们通过计算传播NA 值来搞砸我们...... .

检查模型矩阵:

X <- getME(m4,"X")
ncol(X)  ## 7
(which.dropped <- attr(getME(m4,"X"),"col.dropped"))
## ns(Days, df = 4)4 
##             6

预测均值的新数据框

d <- 0:9  
## best to use data.frame() directly, avoid cbind()
##   generate age based on *actual* levels in data
newdat <- data.frame(Days=d,
   age=factor(rep(levels(sleep$age),length(d))))

创建一个矩阵:

mm <- model.matrix(formula(m4,fixed.only=TRUE)[-2], newdat)
mm <- mm[,-which.dropped]   ## drop redundant columns
## newdat$pred <- mm%*%fixef(m4)    ## works now

由 sianagh 添加:获取置信区间并绘制数据的代码:

predFun <- function(x) predict(x,newdata=newdat,re.form=NA)
newdat$pred <- predFun(m4)
bb <- bootMer(m4,
   FUN=predFun,
    nsim=200)  
## nb. this produces an error message on its first run, 
## but not on subsequent runs (using the development version of lme4)
bb_ci <- as.data.frame(t(apply(bb$t,2,quantile,c(0.025,0.975))))
names(bb_ci) <- c("lwr","upr")
newdat <- cbind(newdat,bb_ci)

剧情:

plot(Reaction~Days,sleep)
with(newdat,
    matlines(Days,cbind(pred,lwr,upr),
            col=c("red","green","green"),
            lty=2,
            lwd=c(3,2,2)))

【讨论】:

  • 非常感谢您的回复。事实上,这个解决方案确实有效。我曾计划使用 bootMer 生成预测间隔,请参阅(r-bloggers.com/confidence-intervals-for-prediction-in-glmms)。但是,这些数据似乎无法支持这一点。如果我运行以下命令:predFun&lt;-function(.) mm%*%fixef(.)bb&lt;-bootMer(m4,FUN=predFun,nsim=200) 我收到 2 个警告:unable to evaluate scaled gradient Model failed to converge: degenerate Hessian with 1 negative eigenvalues. 我认为问题在于数据不支持该功能。你同意吗?
  • 在这个例子的基础上,我修复了 lme4 中的一个 bug。你从 Github 安装开发版本来测试它有多难(即library("devtools"); install_github("lme4/lme4")
  • 使用开发版本,第一次运行时出现同样的错误,但仍然产生估计。在随后的运行中,没有错误警告。每次估计都不同(应该如此)。我不清楚为什么第一次运行后错误消失了。
  • 对于感兴趣的人,我在这个分析中遇到了另一个问题,这表明需要仔细构建模型矩阵(如果使用它)。帖子在这里。 stackoverflow.com/questions/34346755/…
【解决方案2】:

错误是由于漂移分量引起的,如果你放

allowdrift=FALSE

到您的 auto.arima 预测中,它将被修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-20
    • 2021-04-19
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多