繁体   English   中英

从具有随机截距的多级模型生成预测模拟

[英]Generating predictive simulations from a multilevel model with random intercepts

我正在努力了解在R中如何使用具有一组随机截距的多级线性回归模型为新数据生成预测模拟。 继146-147页上的例子。 这段文字 ,我可以不带随机效应的简单线性模型执行此任务。 我无法确定的是如何扩展设置以适应添加到该模型的因素的随机截距。

我将使用iris和一些虚假数据来显示卡住的地方。 我将从一个简单的线性模型开始:

mod0 <- lm(Sepal.Length ~ Sepal.Width, data = iris)

现在,让我们使用该模型为250个新案例生成1,000个预测模拟。 我将从弥补这些情况开始:

set.seed(20912)
fakeiris <- data.frame(Sepal.Length = rnorm(250, mean(iris$Sepal.Length), sd(iris$Sepal.Length)),
                       Sepal.Width = rnorm(250, mean(iris$Sepal.Length), sd(iris$Sepal.Length)),
                       Species = sample(as.character(unique(iris$Species)), 250, replace = TRUE),
                       stringsAsFactors=FALSE)

按照上述文本中的示例,这是我要为这250个新案例中的每个案例获得1,000个预测模拟的操作:

library(arm)
n.sims = 1000  # set number of simulations
n.tilde = nrow(fakeiris)  # set number of cases to simulate
X.tilde <- cbind(rep(1, n.tilde), fakeiris[,"Sepal.Width"])  # create matrix of predictors describing those cases; need column of 1s to multiply by intercept
sim.fakeiris <- sim(mod0, n.sims)  # draw the simulated coefficients
y.tilde <- array(NA, c(n.sims, n.tilde))  # build an array to hold results
for (s in 1:n.sims) { y.tilde[s,] <- rnorm(n.tilde, X.tilde %*% sim.fakeiris@coef[s,], sim.fakeiris@sigma[s]) }  # use matrix multiplication to fill that array

效果很好,现在我们可以执行诸如colMeans(y.tilde)检查这些模拟的主要趋势,并执行cor(colMeans(y.tilde), fakeiris$Sepal.Length)来将其与(假)进行比较。 Sepal.Length的观测值。

现在,让我们尝试对该简单模型进行扩展,在该模型中,我们假定截距在不同的观察组之间变化,这里是物种。 我将使用lmer()lme4包,估计是说明相匹配的简单的多级/层次模型:

library(lme4)
mod1 <- lmer(Sepal.Length ~ Sepal.Width + (1 | Species), data = iris)

好的,那行得通,但是现在呢? 我跑:

sim.fakeiris.lmer <- sim(mod1, n.sims)

当我使用str()检查结果时,我看到它是具有三个组件的sim.merMod类的对象:

  • @fixedef ,一个1,000 x 2的矩阵,具有固定效果的模拟系数(intercept和Sepal.Width)

  • @ranef ,一个具有随机系数模拟系数的1,000 x 3矩阵(这三种)

  • @sigma ,长度为1,000的向量,包含与每个模拟相关的@sigma

我无法解决如何将用于简单线性模型的矩阵构造和乘法扩展到这种情况,这增加了另一个维度。 我查看了文本,但我只能找到一个示例(第272-275页),该示例针对单个组(此处为物种)中的单个案例。 我要执行的现实世界任务涉及针对256个新案例(职业足球比赛)进行这样的模拟,这些模拟平均分布在32个小组(主队)中。 非常感谢您提供的任何帮助。

附录 lme4在发布此lme4之前,我没有查看lme4 simulate.merMod()的详细信息。 我现在有了。 看起来应该可以解决问题,但是当我运行simulate(mod0, nsim = 1000, newdata = fakeiris) ,结果只有150行。 这些值看起来很合理,但是fakeiris有250行(案例)。 那一百五十来自哪里?

一种可能性是使用merTools软件包中的predictInterval函数。 该软件包即将提交给CRAN,但当前的开发版本可从GitHub下载,

    install.packages("devtools")
    devtools::install_github("jknowles/merTools")

要获得100次模拟的中值和95%可信区间:

    mod1 <- lmer(Sepal.Length ~ Sepal.Width + (1 | Species), data = iris)

    out <- predictInterval(mod1, newdata=fakeiris, level=0.95,
                           n.sims=100, stat="median")

默认情况下, predictInterval包含残差,但是您可以通过以下方式关闭该功能:

    out2 <- predictInterval(mod1, newdata=fakeiris, level=0.95,
                           n.sims=100, stat="median", 
                           include.resid.var=FALSE)

希望这可以帮助!

这可能会有所帮助:它不使用sim() ,而是使用mvrnorm()从固定效果参数的采样分布中提取新系数,使用一些内部机制( setBeta0 )重新分配内部值。固定效果系数。 随机效应系数的内部值自动重采样simulate.merMod使用默认参数re.form=NA 但是,残差方差不会重新采样-在整个仿真过程中保持不变,这不是100%现实的。

在您的用例中,您将指定newdata=fakeiris

library(lme4)
mod1 <- lmer(Sepal.Length ~ Sepal.Width + (1 | Species), data = iris)
simfun <- function(object,n=1,newdata=NULL,...) {
    v <- vcov(object)
    b <- fixef(object)
    betapars <- MASS::mvrnorm(n,mu=b,Sigma=v)
    npred <- if (is.null(newdata)) {
                 length(predict(object))
             } else nrow(newdata)
    res <- matrix(NA,npred,n)
    for (i in 1:n) {
        mod1@pp$setBeta0(betapars[i,])
        res[,i] <- simulate(mod1,newdata=newdata,...)[[1]]
    }
    return(res)
}
ss <- simfun(mod1,100)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM