na.action的行为= na.exclude在lme4中使用lmer 1.0-5与lm和旧版本的lme4不一致

Dav*_*ane 4 r lmer

考虑一个简单的例子:

> library(lme4)
Loading required package: lattice
Loading required package: Matrix
> set.seed(1)
> df <- data.frame(x = c(rnorm(7), NA), y = rep(c("A", "B"), 4))
> length(fitted(lm(data = df, x ~ y, na.action = na.exclude)))
[1] 8
Run Code Online (Sandbox Code Playgroud)

这表现得如我所料.虽然第8次观察没有拟合值,但因为x是该行的NA,所以拟合值用NA"填充",使得它们与输入数据帧df中的行数相同,这是非常的便利.但是调用na.action = na.exclude在lme4中不再具有相同的效果.

> length(fitted(lmer(data = df, x ~ (1 | y), na.action = na.exclude)))
[1] 7
Run Code Online (Sandbox Code Playgroud)

我相当肯定,在旧版本的lme4中,长度为8,最后一个值为NA,就像lm()一样.

如何让lmer以与lm相同的方式运行---用NAs填充拟合向量(在适当的位置),使其与输入数据帧中的行数长度相同?

更一般地说,是否存在一些关于na.action和na.exclude正在做什么和/或打算在这里做什么的东西?

我的目标是在应用于lmer模型对象时,使fit()返回一个与行数相同的向量作为输入数据帧(并以相同的顺序!)和"适当"中的NA "地点.有一个简单的方法吗?

谢谢,

戴夫凯恩

更新:感谢Ben Bolker的工作!虽然predict()与fits()不同,但使用它确实解决了我的主要问题.

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] lme4_1.0-5      Matrix_1.1-0    lattice_0.20-23

loaded via a namespace (and not attached):
[1] grid_3.0.2    MASS_7.3-29   minqa_1.2.1   nlme_3.1-111  splines_3.0.2 tools_3.0.2  
Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 5

作为一种快速解决方法,您可以使用predict(没有其他参数)而不是fitted:

length(predict(lmer(data = df, x ~ (1 | y), na.action = na.exclude)))
## 8
Run Code Online (Sandbox Code Playgroud)

(这是1.1-1而不是1.0-5,但我认为结果将是相同的).