我想获得非线性混合nlme
模型预测的95%置信区间。由于没有提供任何标准来执行此操作nlme
,因此我想知道使用“人口预测间隔”方法是否正确(如Ben Bolker的书章所述,该模型基于最大似然的模型)根据拟合模型的方差-协方差矩阵对固定效应参数进行重采样,基于此模拟进行预测,然后取这些预测的95%百分数得到95%的置信区间?
执行此操作的代码如下:(我在这里使用nlme
帮助文件中的“ Loblolly”数据)
library(effects)
library(nlme)
library(MASS)
fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc),
data = Loblolly,
fixed = Asym + R0 + lrc ~ 1,
random = Asym ~ 1,
start = c(Asym = 103, R0 = -8.5, lrc = -3.3))
xvals=seq(min(Loblolly$age),max(Loblolly$age),length.out=100)
nresamp=1000
pars.picked = mvrnorm(nresamp, mu = fixef(fm1), Sigma = vcov(fm1)) # pick new parameter values by sampling from multivariate normal distribution based on fit
yvals = matrix(0, nrow = nresamp, ncol = length(xvals))
for (i in 1:nresamp)
{
yvals[i,] = sapply(xvals,function (x) SSasymp(x,pars.picked[i,1], pars.picked[i,2], pars.picked[i,3]))
}
quant = function(col) quantile(col, c(0.025,0.975)) # 95% percentiles
conflims = apply(yvals,2,quant) # 95% confidence intervals
现在我有了置信度限制,我创建了一个图形:
meany = sapply(xvals,function (x) SSasymp(x,fixef(fm1)[[1]], fixef(fm1)[[2]], fixef(fm1)[[3]]))
par(cex.axis = 2.0, cex.lab=2.0)
plot(0, type='n', xlim=c(3,25), ylim=c(0,65), axes=F, xlab="age", ylab="height");
axis(1, at=c(3,1:5 * 5), labels=c(3,1:5 * 5))
axis(2, at=0:6 * 10, labels=0:6 * 10)
for(i in 1:14)
{
data = subset(Loblolly, Loblolly$Seed == unique(Loblolly$Seed)[i])
lines(data$age, data$height, col = "red", lty=3)
}
lines(xvals,meany, lwd=3)
lines(xvals,conflims[1,])
lines(xvals,conflims[2,])
这是通过这种方式获得的95%置信区间的图:
这种方法是否有效,或者是否有其他方法或更好的方法可以对非线性混合模型的预测计算出95%的置信区间?我不完全确定如何处理模型的随机效应结构。。。应该平均一个随机效应水平吗?还是对一个平均主题有一个置信区间可以吗?这似乎更接近我现在的水平了吗?
这里没有问题。请清楚您的要求。
—
adunaic
我现在想更精确地提出问题……
—
Piet van den Berg
正如我之前在Stack Overflow上问过的那样,我不认为非线性参数的正态性假设是合理的。
—
罗兰
我没有读过Ben的书,但他似乎在本章中并未提到混合模型。也许您在参考他的书时应该澄清一下。
—
罗兰
是的,这是在最大似然模型的背景下进行的,但是想法应该是相同的……我已经澄清了……
—
Piet van den Berg