代码之家  ›  专栏  ›  技术社区  ›  random_forest_fanatic

使用lme4预测新级别

  •  13
  • random_forest_fanatic  · 技术社区  · 9 年前

    我正在尝试拟合一个混合效应模型,然后使用该模型对可能具有不同级别的新数据集生成估计。我预计新数据集的估计值将使用估计参数的平均值,但事实似乎并非如此。下面是一个最小的工作示例:

    library(lme4)
    d = data.frame(x = rep(1:10, times = 3),
                   y = NA,
                   grp = rep(1:3, each = 10))
    d$y[d$grp == 1] = 1:10 + rnorm(10)
    d$y[d$grp == 2] = 1:10 * 1.5 + rnorm(10)
    d$y[d$grp == 3] = 1:10 * 0.5 + rnorm(10)
    fit = lmer(y ~ (1+x)|grp, data = d)
    newdata = data.frame(x = 1:10, grp = 4)
    predict(fit, newdata = newdata, allow.new.levels = TRUE)
    

    在这个例子中,我基本上定义了三个具有不同回归方程的组(斜率为1、1.5和0.5)。然而,当我尝试在一个未知水平的新数据集上进行预测时,我得到了一个恒定的估计值。我本以为斜率和截距的预期值将用于生成新数据的预测。我期待的事情不对吗?或者,我的代码做错了什么?

    2 回复  |  直到 9 年前
        1
  •  17
  •   Roland    9 年前

    如果不包括固定斜率,我通常不会包括随机斜率。看起来 predict.merMod 同意我的观点,因为它似乎只使用固定的效果来预测新的水平。文档中说“预测将使用以前未观测到的数据的无条件(总体水平)值”,但这些值似乎不是用模型规范估计的。

    因此,我建议采用以下模型:

    fit = lmer(y ~ x + (x|grp), data = d)
    newdata = data.frame(x = 1:10, grp = 4)
    predict(fit, newdata = newdata, allow.new.levels = TRUE)
    #       1         2         3         4         5         6         7         8         9        10 
    #1.210219  2.200685  3.191150  4.181616  5.172082  6.162547  7.153013  8.143479  9.133945 10.124410
    

    这与仅使用模型的固定效果部分相同:

    t(cbind(1, newdata$x) %*% fixef(fit))
    #         [,1]     [,2]    [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]    [,10]
    #[1,] 1.210219 2.200685 3.19115 4.181616 5.172082 6.162547 7.153013 8.143479 9.133945 10.12441
    
        2
  •  6
  •   Ben Bolker    9 年前

    也许还不够清楚,但我认为 ?predict.merMod (合理地)清楚地说明 allow.new.levels=TRUE 。我想歧义可能是什么 “无条件(人口水平)值”是指。。。

    allow.new.levels :如果newdata中的新级别(或NA值)为 允许。如果FALSE(默认值),则newdata中的此类新值 将触发错误;如果为TRUE,则预测将使用 数据的无条件(总体级别)值 先前未观察到的水平(或NA)。