R:基于残差的建模

7
我听说人们在想要计算先验模型之后的某些效果时,会谈论“基于残差建模”。例如,如果他们知道两个变量var_1和var_2是相关的,我们首先用var_1建立一个模型,然后再建立var_2的效果模型。我的问题是我从未在实践中见过这样做。
我感兴趣的问题如下:
1. 如果我使用glm,我该如何考虑所使用的链接函数? 2. 当运行第二个glm并将var_2作为解释变量时,我应该选择什么分布?我认为这与问题1有关。 3. 这是否与在第二个模型中使用第一个模型的预测作为抵消有关?
dt <- data.table(mtcars) # I have a hypothesis that `mpg` is a function of both `cyl` and `wt`
dt[, cyl := as.factor(cyl)]
model <- stats::glm(mpg ~ cyl, family=Gamma(link="log"), data=dt) # I want to model `cyl` first
dt[, pred := stats::predict(model, type="response", newdata=dt)]
dt[, res := mpg - pred]

# will this approach work?
model2_1 <- stats::glm(mpg ~ wt + offset(pred), family=Gamma(link="log"), data=dt)
dt[, pred21 := stats::predict(model2_1, type="response", newdata=dt) ]

# or will this approach work?
model2_2 <- stats::glm(res ~ wt, family=gaussian(), data=dt)
dt[, pred22 := stats::predict(model2_2, type="response", newdata=dt) ]

我的第一种建议方法存在收敛问题,但这是我愚蠢的大脑解决这个问题的方式。感谢任何帮助!


1
我在想,如果你在发布帖子时更注重方法的有效性而不是代码,那么这个问题更有可能在交叉验证上得到答案。 - slamballais
1
我没有答案,但是类似的问题在这里被问到:(https://stats.stackexchange.com/questions/47659/residualize-binary-outcome-variable)。一个评论者(在被接受的答案上)添加了有关不同类型残差的注释,这在这里进一步讨论:(https://stats.stackexchange.com/questions/1432/what-do-the-residuals-in-a-logistic-regression-mean)。我发现Maverick Meerkat的答案特别有用。 - slamballais
1
@slamballais 是的,也许你是对的,那是个好主意。不过我感觉我已经投入了很多积分,所以我会坚持的 :D - Helen
2
也许相关的链接:https://stats.stackexchange.com/questions/368369/regressing-logistic-regression-residuals-on-other-regressors,https://besjournals.onlinelibrary.wiley.com/doi/full/10.1046/j.1365-2656.2002.00618.x,https://stats.stackexchange.com/questions/244870/how-to-partial-out-a-covariate-in-logistic-regression - user20650
1
@user20650,谢谢你的建议,非常感谢!我想我需要发布一个交叉验证的帖子 :) - Helen
1个回答

0
在某种意义上,ANCOVA是“对残差进行建模”。 ANCOVA的模型为y_i = grand_mean + treatment_i + b *(covariate-covariate_mean_i)+ error,其中每个处理i都有一个模型。术语(covariate-covariate_mean_i)可以看作是具有协变量作为DV和处理作为IV的模型的残差。
以下回归与此ANCOVA等效:
lm(y ~ treatment * scale(covariate, scale = FALSE))

应用于数据后,它看起来像这样:

lm(mpg ~ factor(cyl) * scale(wt, scale = FALSE), data = mtcars)

并且可以转换为类似于您在示例中使用的glm

glm(mpg ~ factor(cyl) * scale(wt, scale = FALSE), 
    family=Gamma(link="log"), 
    data = mtcars)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接