У меня есть модель логистической регрессии в 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)
но может стать утомительным, когда ваша модель усложнится.
person
Zheyuan Li
schedule
18.07.2018