Получите количество данных на каждом уровне фактора (а также взаимодействие) из подобранного lm или glm [R]

У меня есть модель логистической регрессии в R, где все переменные-предикторы являются категориальными, а не непрерывными (в дополнение к переменной ответа, которая также явно является категориальной/бинарной).

При вызове summary(model_name) есть ли способ включить столбец, представляющий количество наблюдений на каждом уровне фактора?


person Isaac B    schedule 18.07.2018    source источник


Ответы (1)


У меня есть модель логистической регрессии в 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