我想生成GLM函数的预测值,包括随机不确定性。我使用2种方法并比较它们以确保其正确。
rm(list=ls())
library(MASS)
n <- 1500
d <- mvrnorm(n=n, mu=c(0,0,0,0),Sigma=matrix(.7, nrow=4, ncol=4) + diag(4)*.3)
d[,1] <- qgamma(p=pnorm(q=d[,1]), shape=2, rate=2) * 1000
m <- glm(formula=d[,1] ~ d[,2] + d[,3] + d[,4], family=gaussian(link="sqrt"))
p_lin <- m$coef[1] + m$coef[2]*d[,2] + m$coef[3]*d[,3] + m$coef[4]*d[,4]
p1 <- rnorm(n=n, mean=p_lin^2, sd=sd(p_lin^2 - d[,1]))
p2 <- simulate(m)$sim_1
par(mfrow=c(1,1), mar=c(4,2,2,1), pch=16, cex=0.8, pty="s")
xylim <- c(min(c(d[,1], p1, p2)), max(c(d[,1], p1, p2)))
plot(x=d[,1], y=p1, xlab="predicted values", ylab="original data", xlim=xylim, ylim=xylim, col=rgb(0,0,0,alpha=0.1))
points(x=d[,1], y=simulate(m)$sim_1, col=rgb(0,1,0,alpha=0.1))
abline(a=0, b=1, col="red")
预测不同。查看simulate()函数的源代码 (这可以通过使用:
来完成getS3method(c("predict"), class = "glm")
)
我看到simulate()函数应用了一个基于加权的sd:
if (!is.null(object$weights))
vars <- vars/object$weights ftd + rnorm(ntot, sd = sqrt(vars)) # this is the prediction including stochastic uncertainty; ftd is defined as fitted(object)
查看帮助函数,我读到“由lm或glm(family =”gaussian“拟合的线性模型的方法)假设所提供的任何权重与误差方差成反比。”但是,我假设这是关于先前的权重,我没有应用并且是NULL(m $ prior.weights)。但是,模拟函数似乎使用m $权重,这似乎与4 * m $ fitted.values相同。我google了很多,但无法深究这一点。为什么simulate()函数在sd中应用这些权重?它是否正确?这些重量是如何计算的? (它与帖子有关:microsimulation GLM including stochastic part;希望我开始一个新的错误