使用预测比较GLM模型

时间:2014-05-15 18:25:19

标签: r prediction glm

假设我通过在相同数据上调用glm()但使用不同的公式和/或族来创建两个模型。现在我想通过预测未知数据来比较哪个模型更好。像这样:

mod1 <- glm(formula1, family1, data)
mod2 <- glm(formula2, family2, data)
mu1 <- predict(mod1, newdata, type = "response")
mu2 <- predict(mod2, newdata, type = "response")
  1. 如何判断哪些预测mu1mu2更好?
  2. 是否有一些简单的命令来计算预测的对数似然性?

1 个答案:

答案 0 :(得分:2)

使用reproducible example回答这个问题会更容易。

选择一个先验家庭通常更有意义,而不是根据适合度太高 - 例如,如果你有没有明显上限的计数(非负整数)响应,你唯一真正的选择就是指数家族中的Poisson。

set.seed(101)
x <- runif(1000)
mu <- exp(1+2*x)
y <- rgamma(1000,shape=3,scale=mu/3)
d <- data.frame(x,y)

新数据:

nd <- data.frame(x=runif(100))
nd$y <- rgamma(100,shape=3,scale=exp(1+2*nd$x)/3)

适合Gamma和Gaussian:

mod1 <- glm(y~x,family=Gamma(link="log"),data=d)
mod2 <- glm(y~x,family=gaussian(link="log"),data=d)

预测:

mu1 <- predict(mod1, newdata=nd, type="response")
mu2 <- predict(mod2, newdata=nd, type="response")

提取形状/比例参数:

sigma <- sqrt(summary(mod2)$dispersion)
shape <- MASS::gamma.shape(mod1)$alpha

均方根误差:

rmse <- function(x1,x2) sqrt(mean((x1-x2)^2))
rmse(mu1,nd$y)  ## 5.845
rmse(mu2,nd$y)  ## 5.842

负对数可能性:

-sum(dgamma(nd$y,shape=shape,scale=mu1/shape,log=TRUE))  ## 276.84
-sum(dnorm(nd$y,mean=mu2,sd=sigma,log=TRUE))  ## 318.4