Выбор между LM и GLM для лог-преобразованной переменной ответа


55

Я пытаюсь понять философию использования Обобщенной линейной модели (GLM) по сравнению с линейной моделью (LM). Я создал пример набора данных ниже, где:

log(y)=x+ε

В этом примере ошибка ε зависит от величины y , поэтому я предположил бы, что линейная модель лог-преобразованного y будет наилучшей. В приведенном ниже примере это действительно так (я думаю) - поскольку AIC LM на лог-преобразованных данных является самым низким. AIC GLM гамма-распределения с функцией log-link имеет меньшую сумму квадратов (SS), но дополнительные степени свободы приводят к несколько более высокому AIC. Я был удивлен, что гауссовское распределение AIC намного выше (хотя SS - самая низкая из моделей).

Я надеюсь получить несколько советов о том, когда следует подходить к моделям GLM - т.е. есть ли что-то, что я должен искать в моих остатках соответствия модели LM, чтобы сказать мне, что другое распределение является более подходящим? Кроме того, как следует поступить в выборе подходящего семейства распределения.

Заранее большое спасибо за вашу помощь.

[РЕДАКТИРОВАТЬ]: Теперь я настроил итоговую статистику так, чтобы SS лог-преобразованной линейной модели был сопоставим с моделями GLM с функцией log-link. График статистики теперь отображается.

пример

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 gamlss пакет для tgat, но это никогда не работает для меня понятно. Может быть, вам повезет больше.
pauljohn32

Ответы:


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)

Я нашел это очень полезным: christoph-scherber.de/content/PDF%20Files/…
Адитья,

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 породил ваш ответ (я верю, что так и сделал), то я думаю, что он имеет в виду не генерацию данных, а формулировку модели GLM @peterellis.
Марк в коробке

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.