从拟合的lm或glm中获取每个因子水平(以及相互作用)的数据数量[R]

时间:2018-07-18 18:40:21

标签: r regression linear-regression lm glm

我在R中有一个logistic回归模型,其中所有预测变量都是分类的而不是连续的(除了响应变量也很明显是分类/二进制的)。

调用summary(model_name)时,是否可以包含一列来表示每个因子水平内的观察次数?

1 个答案:

答案 0 :(得分:2)

  

我在R中有一个逻辑回归模型,其中所有的预测变量都是分类的而不是连续的。

如果所有协变量都是因子(不包括截距),则这非常容易,因为模型矩阵仅包含0和1,数字1表示数据中该因子水平(或相互作用水平)的出现。因此,colSums(model.matrix(your_glm_model_object))就是这样。

由于模型矩阵具有列名,所以colSums将为您提供一个具有“名称”属性的向量,该属性与coef(your_glm_model_object)的“名称”字段一致。

对于任何分布族,相同的解决方案适用于线性模型(按lm)和广义线性模型(按glm)。


这是一个简单的例子:

set.seed(0)
f1 <- sample(gl(2, 50))  ## a factor with 2 levels, each with 50 observations
f2 <- sample(gl(4, 25))  ## a factor with 4 levels, each with 25 observations
y <- rnorm(100)
fit <- glm(y ~ f1 * f2)  ## or use `lm` as we use `guassian()` family object here
colSums(model.matrix(fit))
#(Intercept)         f12         f22         f23         f24     f12:f22 
#        100          50          25          25          25          12 
#    f12:f23     f12:f24 
#         12          14 

在这里,我们有100个观察值/完整案例(在(Intercept)下指示)。


  

是否可以显示每个因素的基线水平的计数?

基线水平是对比的,因此它们不会出现在用于拟合的模型矩阵中。但是,我们可以根据公式而不是拟合的模型生成完整的模型矩阵(不带对比)(如果您在模型中包含数字变量,这也为您提供了一种删除数字变量的方法):

SET_CONTRAST <- list(f1 = contr.treatment(nlevels(f1), contrast = FALSE),
                     f2 = contr.treatment(nlevels(f2), contrast = FALSE))
X <- model.matrix(~ f1 * f2, contrasts.arg = SET_CONTRAST)
colSums(X)
#(Intercept)         f11         f12         f21         f22         f23 
#        100          50          50          25          25          25 
#        f24     f11:f21     f12:f21     f11:f22     f12:f22     f11:f23 
#         25          13          12          13          12          13 
#    f12:f23     f11:f24     f12:f24 
#         12          11          14 

请注意,当您有很多因子变量时,设置对比度会很快变得很乏味。

model.matrix绝对不是唯一的方法。常规方式可能是

table(f1)
table(f2)
table(f1, f2)

但是当您的模型变得复杂时,它也会变得乏味。