lme4中的异方相GLMM

时间:2014-05-19 16:50:29

标签: r lme4 random-effects

我正在尝试使用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中指定这种模型的方法吗?

非常感谢任何提示!

0 个答案:

没有答案