【问题标题】:Extracting the intercepts for a dependent factor in a model提取模型中依赖因子的截距
【发布时间】: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 这实际上比任意设置基线要好得多。如果你把它变成我会接受的答案?

标签: r model


【解决方案1】:

没有基线因子水平的一种方法是拟合没有截距的模型。这可以通过y ~ 0 + x + . 之类的公式或通过添加-1 而不是0 来完成。

model2 <- glm(y ~ 0 + ., data, family = binomial)
intercepts2 <- coef(model2)[-1]
names(intercepts2) <- levels(data$language)
intercepts2
#       de     en-GB     en-US 
#15.846295  8.696764  6.562384 

现在与问题中发布的结果进行比较。

model <- glm(y ~ ., data, family = binomial)

coeffs = coef(model)
intercepts = c("baseline" = 0, tail(coeffs, -2)) + coeffs["(Intercept)"]
names(intercepts) <- levels(data$language)
intercepts
#       de     en-GB     en-US 
#15.846295  8.696764  6.562384 

all.equal(intercepts, intercepts2)
#[1] TRUE

结果不是identical(),计算方式不同:

intercepts - intercepts2
#          de        en-GB        en-US 
#3.197442e-14 3.907985e-14 3.552714e-14

数据创建代码。

我将采用内置数据集iris 作为数据示例。

data <- iris[c(1,2,5)]
data$y <- +(data[[1]] < 5.8)
data <- data[-1]
names(data)[c(1,2)] <- c('x', 'language')
i1 <- data[[2]] == "setosa"
i2 <- data[[2]] == "versicolor"
i3 <- data[[2]] == "virginica"
data[[2]] <- as.character(data[[2]])
data[[2]][i1] <- 'de'
data[[2]][i2] <- 'en-GB'
data[[2]][i3] <- 'en-US'
data[[2]] <- factor(data[[2]])

【讨论】:

  • 我可以忍受 10^{-14} 的差异!
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 2019-02-12
  • 2015-02-21
相关资源
最近更新 更多