【发布时间】:2019-10-23 01:52:42
【问题描述】:
假设我像这样在 R 中拟合模型:
model = glm(y ~ x + language, family = binomial, data = data)
language是因子变量;这个想法是每种语言都有不同的拦截。
这是model 系数:
> coef(model)
(Intercept) x languageen-GB languageen-US languageja languageko
-17.919438297 0.003119914 -0.427067341 -0.613194669 1.406719444 2.402191148
languagezh
0.894899827
language 因子的一个级别 (de) 已被选为基线,(Intercept) 给出了该基线的截距。 languageen-GB 等,将截距作为基线截距的增量给出。
这段代码
coeffs = coef(model)
intercepts = c("baseline" = 0, tail(coeffs, -2)) + coeffs["(Intercept)"]
names(intercepts) <- levels(data$language)
intercepts
提取每个因子水平的实际截距:
de en-GB en-US ja ko zh
-17.91944 -18.34651 -18.53263 -16.51272 -15.51725 -17.02454
但这是可怕的代码。必须有更好的方法来使用模型方法或包函数...?
编辑:一个特别不愉快的部分是,如果您更改公式,tail(coeffs, -2) 将会中断。我想这里可以使用某种字符串搜索。
【问题讨论】:
-
您可以使用公式
y ~ 0 + x + language重新调整没有截距的模型。但这更加笨拙。用那个代码写一个函数? -
@RuiBarradas IMO 这实际上比任意设置基线要好得多。如果你把它变成我会接受的答案?