在LM和GLM之间选择对数转换后的响应变量


55

我试图了解使用广义线性模型(GLM)与线性模型(LM)的原理。我在下面创建了一个示例数据集:

log(y)=x+ε

该示例的误差不随y的大小而变化,因此我假设对数转换的y的线性模型是最好的。在下面的示例中,确实是这种情况(我认为)-因为LM在对数转换后的数据上的AIC最低。具有对数链接功能的Gamma分布GLM的AIC具有较低的平方和(SS),但是附加的自由度会导致AIC稍高。我惊讶于高斯分布AIC如此之高(即使SS是模型中最低的)。εy

我希望就何时应该使用GLM模型获得一些建议-即我应该在LM模型拟合残差中寻找一些东西来告诉我另一种分布更合适吗?另外,应该如何选择合适的分销家庭。

在此先感谢您的帮助。

[编辑]:我现在调整了摘要统计信息,以便对数转换后的线性模型的SS与具有对数链接功能的GLM模型相当。现在显示统计图。

set.seed(1111)
n <- 1000
y <- rnorm(n, mean=0, sd=1)
y <- exp(y)
hist(y, n=20)
hist(log(y), n=20)

x <- log(y) - rnorm(n, mean=0, sd=1)
hist(x, n=20)

df  <- data.frame(y=y, x=x)
df2 <- data.frame(x=seq(from=min(df$x), to=max(df$x),,100))


#models
mod.name <- "LM"
assign(mod.name, lm(y ~ x, df))
summary(get(mod.name))
plot(y ~ x, df)
lines(predict(get(mod.name), newdata=df2) ~ df2$x, col=2)

mod.name <- "LOG.LM"
assign(mod.name, lm(log(y) ~ x, df))
summary(get(mod.name))
plot(y ~ x, df)
lines(exp(predict(get(mod.name), newdata=df2)) ~ df2$x, col=2)

mod.name <- "LOG.GAUSS.GLM"
assign(mod.name, glm(y ~ x, df, family=gaussian(link="log")))
summary(get(mod.name))
plot(y ~ x, df)
lines(predict(get(mod.name), newdata=df2, type="response") ~ df2$x, col=2)

mod.name <- "LOG.GAMMA.GLM"
assign(mod.name, glm(y ~ x, df, family=Gamma(link="log")))
summary(get(mod.name))
plot(y ~ x, df)
lines(predict(get(mod.name), newdata=df2, type="response") ~ df2$x, col=2)

#Results
model.names <- list("LM", "LOG.LM", "LOG.GAUSS.GLM", "LOG.GAMMA.GLM")

plot(y ~ x, df, log="y", pch=".", cex=3, col=8)
lines(predict(LM, newdata=df2) ~ df2$x, col=1, lwd=2)
lines(exp(predict(LOG.LM, newdata=df2)) ~ df2$x, col=2, lwd=2)
lines(predict(LOG.GAUSS.GLM, newdata=df2, type="response") ~ df2$x, col=3, lwd=2)
lines(predict(LOG.GAMMA.GLM, newdata=df2, type="response") ~ df2$x, col=4, lwd=2)
legend("topleft", legend=model.names, col=1:4, lwd=2, bty="n") 

res.AIC <- as.matrix(
    data.frame(
        LM=AIC(LM),
        LOG.LM=AIC(LOG.LM),
        LOG.GAUSS.GLM=AIC(LOG.GAUSS.GLM),
        LOG.GAMMA.GLM=AIC(LOG.GAMMA.GLM)
    )
)

res.SS <- as.matrix(
    data.frame(
        LM=sum((predict(LM)-y)^2),
        LOG.LM=sum((exp(predict(LOG.LM))-y)^2),
        LOG.GAUSS.GLM=sum((predict(LOG.GAUSS.GLM, type="response")-y)^2),
        LOG.GAMMA.GLM=sum((predict(LOG.GAMMA.GLM, type="response")-y)^2)
    )
)

res.RMS <- as.matrix(
    data.frame(
        LM=sqrt(mean((predict(LM)-y)^2)),
        LOG.LM=sqrt(mean((exp(predict(LOG.LM))-y)^2)),
        LOG.GAUSS.GLM=sqrt(mean((predict(LOG.GAUSS.GLM, type="response")-y)^2)),
        LOG.GAMMA.GLM=sqrt(mean((predict(LOG.GAMMA.GLM, type="response")-y)^2))
    )
)

png("stats.png", height=7, width=10, units="in", res=300)
#x11(height=7, width=10)
par(mar=c(10,5,2,1), mfcol=c(1,3), cex=1, ps=12)
barplot(res.AIC, main="AIC", las=2)
barplot(res.SS, main="SS", las=2)
barplot(res.RMS, main="RMS", las=2)
dev.off()

在此处输入图片说明

在此处输入图片说明


exp(Xbeta^)y1/2×sigma2

1
R不提供族的另一种模型是对数正态分布。SAS将适合这一点,我不知道为什么R glm不适合。有人建议使用R包来代替tgat,但对我来说却永远无法理解。也许您会有更好的运气。
pauljohn32

Answers:


23

思考这个问题的努力。这是一个不完整的答案,但对于后续步骤有些帮助。

首先,由于分布和链接功能不同,基于似然性的AIC分数在不同的尺度上,因此无法比较。您的平方和和平均平方和是在原始比例下计算的,因此是在同一比例上,因此可以进行比较,尽管这是否是模型选择的良好标准是另一个问题(可能是,也可能不是) -在模型选择中搜索经过交叉验证的档案,以进行一些很好的讨论。

对于更笼统的问题,关注此问题的一个好方法是考虑LOG.LM(您的线性模型,其响应为log(y))之间的区别;和LOG.GAUSS.GLM,glm的响应为y,并具有日志链接功能。在第一种情况下,您要拟合的模型是:

log(y)=Xβ+ϵ

在glm()情况下是:

log(y+ϵ)=Xβ

ϵN(0,σ2)


3
ϵ

4
E(Y)=g1(Xβ)g(E(Y))=XβE(Y)


16

E[ln(Y|x)]ln([E(Y|X])

在我看来,关于分布族是一个关于方差及其与均值的关系的问题。例如,在一个高斯族中,我们有恒定的方差。在伽玛族中,方差是均值的二次函数。绘制标准化残差与拟合值的关系图,看看它们的状态。


1
+1与实际上如何选择合适的家庭有关(我想这里还有更多的讨论余地)
etov

7

Rlog(y)=x+εx=log(y)+εxy

ly = log(y)
REVERSE.REGRESSION = lm(x~ly)
summary(REVERSE.REGRESSION)
# Call:
# lm(formula = x ~ ly)
# 
# Residuals:
#      Min       1Q   Median       3Q      Max 
# -2.93996 -0.64547 -0.01351  0.63133  2.92991 
# 
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  0.01563    0.03113   0.502    0.616    
# ly           1.01519    0.03138  32.350   <2e-16 ***
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 0.984 on 998 degrees of freedom
# Multiple R-squared:  0.5119,    Adjusted R-squared:  0.5114 
# F-statistic:  1047 on 1 and 998 DF,  p-value: < 2.2e-16

该模型的指标(如AIC)无法与您的模型进行比较。但是,我们知道这是基于数据生成过程的正确模型,并且请注意估计的系数恰好在目标上。


谢谢你的评论。我承认,示例数据可能会更好,但我认为它在产生错误方面是正确的。在该示例中,没有截距,并且斜率是1。如果绕过线x = log(y) - rnorm(n, mean=0, sd=1),则得到log(y)= x + rnorm(n,mean = 0,sd = 1)。如果@whuber的评论产生了您的答案(我相信是的),那么我相信他不是在指数据生成,而是指@peterellis的GLM模型表述。
马克·马克(Marc)在

0

该选择基于您对变量的假设。

Var(XtE(Xt)=constant

伽玛分布基于

Var(Xt)E(Xt)=constant

对数变换基于以下假设:

Var(Xt=E(Xt)σ

通过这种方式,

Xt=Xt=E(Xt)XtE(Xt)=E(Xt)XtE(Xt)+E(Xt)E(Xt)=E(Xt)(1+XtE(Xt)E(Xt))

根据泰勒规则,

log(1+x)x

我们得到

log(1+XtE(Xt)E(Xt))=XtE(Xt)E(Xt)

从而,

Xt=E(Xt)(1+XtE(Xt)E(Xt))logXt=logE(Xt)+log(1+XtE(Xt)E(Xt))=logE(Xt)+XtE(Xt)E(Xt)E(logXt)logE(Xt)

但是,伽玛分布基于以下假设:

YΓ(α,β)

{E(yi)=αiβiVar(yi)=αiβi2Var(yi)E(yi)=βi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.