我正在尝试使用 lme4 拟合具有随机效应的泊松回归模型。我的响应变量 Y 表示双向表中的频率,但我只对协变量对交互的影响(表 Y 的对数线性表示的 alpha_aj 项)感兴趣,因此设计矩阵包括每一行的固定效应和在我的情况下不感兴趣的列。
我想将特定于单元格的随机效应与特定于列的差异包括在内。但是,当使用 glmer 时,我在模型中声明的第一列的估计方差分量始终为零,就好像存在某种多重共线性一样。我不明白为什么会发生这种情况,特别是因为当只假设一个共同方差时,预测的随机效应似乎不受任何限制。任何帮助将非常感激。
我的数据的一个例子是:
A <- 26 #number of rows
J <- 3 #number of columns
y <- c(3117, 2426, 3048, 2830, 5151, 5399, 3331, 4631, 4419, 4434, 4356, 2161,
6057, 3154, 5250, 4209, 2880, 4193, 5017, 7642, 3977, 5605, 4362, 5785,
4044, 7259, 345, 371, 324, 393, 406, 303, 253, 284, 627, 520,
296, 428, 589, 381, 723, 506, 382, 825, 481, 572, 446, 486,
603, 682, 526, 549, 1967, 1803, 1811, 1924, 1778, 1508, 1387, 1325,
2259, 1737, 1209, 1699, 2247, 1463, 2548, 1469, 1504, 2610, 1703, 2444,
1984, 1742, 2365, 2653, 1984, 2749)
x <- c(0.02, -0.26, 0.00, -0.20, 0.15, 0.21, 0.18, 0.22, -0.05, 0.06,
0.28, -0.19, -0.02, 0.07, -0.15, 0.05, -0.04, -0.19, 0.13, 0.06,
0.02, 0.08, -0.19, -0.19, -0.08, 0.05, -0.17, 0.13, -0.12, 0.10,
-0.12, -0.05, -0.11, -0.06, 0.07, -0.01, 0.01, 0.06, 0.05, -0.13,
0.15, 0.00, -0.09, 0.09, -0.04, -0.03, -0.05, 0.00, 0.13, 0.15,
0.04, 0.01, 0.15, 0.14, 0.12, 0.10, -0.03, -0.17, -0.06, -0.16,
-0.02, -0.05, -0.29, 0.13, -0.03, 0.06, 0.00, -0.05, 0.13, 0.11,
-0.09, -0.03, 0.03, -0.08, 0.06, 0.05, 0.04, -0.06)
表 Y 按列堆叠。要定义我使用的设计矩阵,
zg <- kronecker(matrix(1,J,1),diag(A)) #area specific fixed effects
zl <- rbind(kronecker(diag(2),matrix(1,A,1)),matrix(-1,A,J-1)) #column specific fixed effects
z <- cbind(zg,zl,x)
具有共同方差的模型可以使用
library(lme4)
id <- seq(1,A*J)
model1 <- glmer(y ~ -1+z + (1|id),family = "poisson")
refit(model1)
为了使模型与特定于列的方差分量相匹配,我正在使用:
col <- kronecker(diag(3),matrix(1,A,1))
model2 <- glmer(y ~ -1+z +
(-1+col[,1]|id) + (-1+col[,2]|id)+(-1+col[,3]|id) ,family = "poisson")
refit(model2)
我得到结果:
Random effects:
Groups Name Std.Dev.
id col[, 1] 0.0000
id.1 col[, 2] 0.1973
id.2 col[, 3] 0.1231
如您所见,col1 的估计方差分量为零。如果我更改用于声明预测变量的顺序,
model3 <- glmer(y ~ -1+z +
(-1+col[,2]|id) + (-1+col[,3]|id)+(-1+col[,1]|id) ,family = "poisson")
refit(model3)
现在是第二列,它的方差分量估计为零:
Random effects:
Groups Name Std.Dev.
id col[, 2] 0.0000
id.1 col[, 3] 0.1422
id.2 col[, 1] 0.1861
从模型的定义来看,我不明白为什么我不能为三列提供特定于列的差异。我想我错过了一些东西,提前感谢任何提示!
已编辑(2)!!!
使用初始数据,我试图了解是否有任何理由应该限制方差。我使用 MCMCglmm 拟合模型:
model0 <- glm(y ~ -1+z ,family = "poisson")
prior <- list(B = list(mu=model0$coefficients,V=summary(model0)$cov.unscaled))
data <- data.frame(y,z,col,id)
data$column <- data$X1+2*data$X2+3*data$X3
library(MCMCglmm)
model3 <- MCMCglmm(y~-1+V1+V2+V3+V4+V5+V6+V7+V8+V9+V10+V11+V12+V13+V14+V15+V16+
V17+V18+V19+V20+V21+V22+V23+V24+V25+V26+V27+V28+x,
random= ~idh(1):id, data = data, family="poisson",
rcov = ~idh(1):column,
pr=TRUE, prior=prior,
verbose=TRUE, DIC=TRUE, singular.ok=FALSE, saveX=TRUE,
saveZ=TRUE, saveXL=TRUE, slice=FALSE, ginverse=NULL,
nitt=50000, thin=10, burnin=10000)
std.dev <- c(sqrt(sum((model3$Sol[,-c(1:(A+J))]^2)[,1:A])/(nrow(model3$Sol)*A)),
sqrt(sum((model3$Sol[,-c(1:(A+J))]^2)[,(A+1):(2*A)])/(nrow(model3$Sol)*A)),
sqrt(sum((model3$Sol[,-c(1:(A+J))]^2)[,(2*A+1):(3*A)])/(nrow(model3$Sol)*A)))
估计的特定列方差分量为:
[1] 0.05413170 0.13366658 0.08073213
我仍然不明白为什么在与 lme4 拟合时不应该使用特定于列的差异。我认为在拟合模型之前会检查 lme4 是否正在执行,最终将方差分量设置为零。有人知道在 lme4 中指定这种模型的另一种方法吗?
非常感谢任何提示!