Логістична регресія, аж до числової неточності, буде відповідати точно так само, як табльовані відсотки. Отже, якщо ваші незалежні змінні є факторними об'єктами factor1
тощо, а залежні результати (0 і 1) є x
, то ви можете отримати ефекти з виразом типу
aggregate(x, list(factor1, <etc>), FUN=mean)
Порівняйте це з
glm(x ~ factor1 * <etc>, family=binomial(link="logit"))
Як приклад, давайте генеруємо кілька випадкових даних:
set.seed(17)
n <- 1000
x <- sample(c(0,1), n, replace=TRUE)
factor1 <- as.factor(floor(2*runif(n)))
factor2 <- as.factor(floor(3*runif(n)))
factor3 <- as.factor(floor(4*runif(n)))
Підсумок виходить за допомогою
aggregate.results <- aggregate(x, list(factor1, factor2, factor3), FUN=mean)
aggregate.results
Його вихід включає
Group.1 Group.2 Group.3 x
1 0 0 0 0.5128205
2 1 0 0 0.4210526
3 0 1 0 0.5454545
4 1 1 0 0.6071429
5 0 2 0 0.4736842
6 1 2 0 0.5000000
...
24 1 2 3 0.5227273
Для подальшої довідки оцінка факторів на рівнях (1,2,0) у рядку 6 результату становить 0,5.
Логістична регресія дає свої коефіцієнти таким чином:
model <- glm(x ~ factor1 * factor2 * factor3, family=binomial(link="logit"))
b <- model$coefficients
Для їх використання нам потрібна логістична функція:
logistic <- function(x) 1 / (1 + exp(-x))
Для отримання, наприклад, оцінки факторів на рівнях (1,2,0), обчислити
logistic (b["(Intercept)"] + b["factor11"] + b["factor22"] + b["factor11:factor22"])
(Зверніть увагу, як усі взаємодії повинні бути включені в модель, і всі пов'язані коефіцієнти повинні бути застосовані, щоб отримати правильну оцінку.)
(Intercept)
0.5
погоджуючись з результатами aggregate
. (Заголовок "(Перехоплення)" у виході - це залишок вхідних даних і фактично безглуздий для цього обчислення.)
Ця ж інформація у ще одній формі відображається у висновкуtable
. Наприклад, (тривалий) вихід
table(x, factor1, factor2, factor3)
включає цю панель:
, , factor2 = 2, factor3 = 0
factor1
x 0 1
0 20 21
1 18 21
factor1
21/(21+21)=0.5x
1aggregate
glm
Нарешті, комбінація факторів, що дають найбільшу частку в наборі даних , зручно отримувати з результатів aggregate
:
> aggregate.results[which.max(aggregate.results$x),]
Group.1 Group.2 Group.3 x
4 1 1 0 0.6071429