从拟合的 lm 或 glm [R] 中获取每个因子级别(以及交互)的数据数
Get number of data in each factor level (as well as interaction) from a fitted lm or glm [R]
我在 R 中有一个逻辑回归模型,其中所有预测变量都是分类变量而不是连续变量(除了响应变量,这显然也是 categorical/binary)。
调用 summary(model_name)
时,有没有办法在每个因子水平内包含一个表示观察数的列?
I have a logistic regression model in R, where all of the predictor variables are categorical rather than continuous.
如果您所有的协变量都是因子(不包括截距),这很容易,因为模型矩阵仅包含 0 和 1,而 1 的数量表示该因子水平(或交互作用水平)在您的模型中出现数据。所以就做 colSums(model.matrix(your_glm_model_object))
.
由于模型矩阵有列名,colSums
会给你一个带有 "names" 属性的向量,与 coef(your_glm_model_object)
的 "names" 字段一致。
相同的解决方案适用于任何分布族的线性模型(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)
下表示)。
Is there a way to display the count for the baseline level of each factor?
基线水平是对比的,因此它们不会出现在用于拟合的模型矩阵中。然而,我们可以从你的公式而不是你的拟合模型生成完整的模型矩阵(没有对比)(如果你的模型中有数字变量,这也为你提供了一种删除数字变量的方法):
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)
但当您的模型变得复杂时,也会变得乏味。
我在 R 中有一个逻辑回归模型,其中所有预测变量都是分类变量而不是连续变量(除了响应变量,这显然也是 categorical/binary)。
调用 summary(model_name)
时,有没有办法在每个因子水平内包含一个表示观察数的列?
I have a logistic regression model in R, where all of the predictor variables are categorical rather than continuous.
如果您所有的协变量都是因子(不包括截距),这很容易,因为模型矩阵仅包含 0 和 1,而 1 的数量表示该因子水平(或交互作用水平)在您的模型中出现数据。所以就做 colSums(model.matrix(your_glm_model_object))
.
由于模型矩阵有列名,colSums
会给你一个带有 "names" 属性的向量,与 coef(your_glm_model_object)
的 "names" 字段一致。
相同的解决方案适用于任何分布族的线性模型(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)
下表示)。
Is there a way to display the count for the baseline level of each factor?
基线水平是对比的,因此它们不会出现在用于拟合的模型矩阵中。然而,我们可以从你的公式而不是你的拟合模型生成完整的模型矩阵(没有对比)(如果你的模型中有数字变量,这也为你提供了一种删除数字变量的方法):
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)
但当您的模型变得复杂时,也会变得乏味。