GLMER 模型在同一数据上为 fitted.values() 和 predict() 生成不同的值

GLMER model produces different values for fitted.values() and predict() on same data

我已经训练了一个非常复杂的(随机截距和斜率)混合逻辑模型,然后我用它来预测新数据。我的预测很不准确,所以我比较了原始数据的预测值,发现它们与我的 fitted.values() 有很大不同。例如。仅取第一个数据点,拟合值为 0.359,预测值 (predict(model, newdata=data, type="response") 为 0.0585。我很确定这个问题与随机效应有关,因为如果我预测同一个数据点只有固定效应,我得到 0.707,这是我所期望的,而随机效应只给出 0.0252,这是非常错误的。

您可以通过绘制拟合与预测(下)来查看不同的随机效应组。这也显示了组内的梯度是如何相同的,所以它看起来像是截距而不是斜率的问题。

非常感谢任何帮助!

编辑:如果有帮助,公式基本上如下所示:

y ~ (1 | re1) + 
    (1 | re2) + 
    (1 | re3) +  
    fe1 + fe2 + 
    (1 + rs1 |  re1) + 
    (1 + rs1 | re2) + 
    (1 |  re4:re1) + 
    (1 | re4:re2) + 
    (1 |  re5:re2) + 
    (1 | re5:re1) + 
    (1 +  rs2 | re1) + 
    (1 + rs2 |  re2) + 
    (1 + rs3 | re1) + 
    (1 +  rs3 | re2)

编辑 2:这是一个代表。我用几个不同的种子试过这个,差异很大。例如。种子 42 看起来几乎相同(但结果并不完全相同)。


library(lme4)

set.seed(25)

y <- as.factor(round(runif(1000,0,1)))

re1 <- as.factor(round(runif(1000,1,5)))
re2 <- as.factor(round(runif(1000,1,4)))
re3 <- as.factor(round(runif(1000,0,1)))

fe1 <- runif(1000,0,1)
fe2 <- runif(1000,0,1)

rs1 <- runif(1000,0,1)
rs2 <- runif(1000,0,1)

df <- data.frame(y=y,
                 re1=re1,
                 re2=re2,
                 re3=re3,
                 fe1=fe1,
                 fe2=fe2,
                 rs1=rs1,
                 rs2=rs2)

model <- glmer(y ~ (1 | re1) + 
                 (1 | re2) + 
                 (1 | re3) +  
                 fe1 + fe2 + 
                 (1 + rs1 |  re1) + 
                 (1 + rs1 | re2), family="binomial", data=df)

plot(fitted.values(model), predict(model, newdata=df, type="response"))

型号:

glmer(y ~ (1 | re1) + 
                   (1 | re2) + 
                   (1 | re3) +  
                   fe1 + fe2 + 
                   (1 + rs1 |  re1) + 
                   (1 + rs1 | re2), family="binomial", data=df)

是病态的。 (1 | re1)(1 | re2) 是多余的,因为您还适合 (1 + rs1 | re1)(1 + rs1 | re2)。如果目的是估计不相关的随机效应,那么您可以使用 (1 | re1) + (0 + rs1 | re1)(1 | re2) + (0 + rs1 | re2)

如果删除这些多余的术语:

  model <- glmer(y ~ (1 | re3) +  
                   fe1 + fe2 + 
                   (1 + rs1 |  re1) + 
                   (1 + rs1 | re2), family="binomial", data=df)

然后你从fitted.valuespredict获得相同的值:

plot(fitted.values(model), predict(model, newdata=df, type="response"))

这个模型是单一的 - 原始模型也是如此 - 但这是一个不同的问题。