Как я могу запустить цикл логистической регрессии, который будет работать со всеми независимыми переменными, парами и трио
Я хотел бы запустить зависимую переменную логистической регрессии (в моем наборе данных это: dat$admit) со всеми доступными переменными, парами и трио (3 независимых переменных), каждая регрессия с различными независимыми переменными и зависимой переменной. Результат, который я хотел бы получить, - это список каждой регрессионной сводки подряд: коэффициент, значение p,AUC,CI 95%. Используя набор данных, представленный ниже, должно быть 7 регрессий:
dat$admit vs dat$female
dat$admit vs dat$apcalc
dat$admit vs dat$num
dat$admit vs dat$female + dat$apcalc
dat$admit vs dat$female + dat$num
dat$admit vs dat$apcalc + dat$num
dat$admit vs dat$female + dat$apcalc + dat$num
Вот примерный набор данных (где dat $ admit является зависимой от логистической регрессии переменной):
dat <- read.table(text = " female apcalc admit num
0 0 0 7
0 0 1 1
0 1 0 3
0 1 1 7
1 0 0 5
1 0 1 1
1 1 0 0
1 1 1 6",header = TRUE)
Согласно комментарию @marek, результат должен быть таким (только для женщины и от женщины и apcalc): # Значение перехвата P-значение (перехват) P-значение (оценка) AUC # женщина 0,000000e+00 0,000000e+00 1 1 0,5
сука +apcalc 0,000000e+00 0,000000e+00 1 1 0,5
Есть хороший код, который написал @David Arenburg, который производит статистику, но без создания моделей пар и трио, поэтому я хотел бы знать, как можно добавлять модели создания. Вот код Дэвида Аренбурга?
library(caTools)
ResFunc <- function(x) {
temp <- glm(reformulate(x,response="admit"), data=dat,family=binomial)
c(summary(temp)$coefficients[,1],
summary(temp)$coefficients[,4],
colAUC(predict(temp, type = "response"), dat$admit))
}
temp <- as.data.frame(t(sapply(setdiff(names(dat),"admit"), ResFunc)))
colnames(temp) <- c("Intercept", "Estimate", "P-Value (Intercept)", "P-Value (Estimate)", "AUC")
temp
# Intercept Estimate P-Value (Intercept) P-Value (Estimate) AUC
# female 0.000000e+00 0.000000e+00 1 1 0.5
# apcalc 0.000000e+00 0.000000e+00 1 1 0.5
# num 5.177403e-16 -1.171295e-16 1 1 0.5
Есть идеи, как создать этот список? Спасибо Рон
1 ответ
Простое решение - составить список моделей вручную:
results <- list(
"female" = glm(admit~female , family=binomial, dat)
,"apcalc" = glm(admit~apcalc , family=binomial, dat)
,"num" = glm(admit~num , family=binomial, dat)
,"female + apcalc" = glm(admit~female + apcalc, family=binomial, dat)
,"female + num" = glm(admit~female + num , family=binomial, dat)
,"apcalc + num" = glm(admit~apcalc + num , family=binomial, dat)
,"all" = glm(admit~female + apcalc + num, family=binomial, dat)
)
Тогда вы можете проверить модели по lapply
над списком моделей:
lapply(results, summary)
Или более продвинутый (коэффициент статистики):
require(plyr)
ldply(results, function(m) {
name_rows(as.data.frame(summary(m)$coefficients))
})
Аналогичным образом вы можете извлечь любую информацию, которую вы хотите. Просто напишите функцию для извлечения желаемой статистики, которая принимает модель glm в качестве аргумента:
get_everything_i_want <- function(model) {
#... do what i want ...
# eg:
list(AIC = AIC(model))
}
и затем примените к каждой модели:
lapply(results, get_everything_i_want)
# $female
# $female$AIC
# [1] 15.0904
# $apcalc
# $apcalc$AIC
# [1] 15.0904
# $num
# $num$AIC
# [1] 15.0904
# $`female + apcalc`
# $`female + apcalc`$AIC
# [1] 17.0904
# $`female + num`
# $`female + num`$AIC
# [1] 17.0904
# $`apcalc + num`
# $`apcalc + num`$AIC
# [1] 17.0904
# $all
# $all$AIC
# [1] 19.0904