2016-11-23 11 views
0

Уважаемый пользователь, начинающий заходить на сайтR: Как создать таблицу хороших результатов (sjPlot) из последовательного вывода нескольких GLM?

Я работаю над исследованием в R, где я делаю несколько биномиальных логистических регрессий с разными иждивенцами. Эти анализы проводятся неоднократно с незначительными изменениями, и я делюсь результатами с моими сотрудниками, оптимально в симпатичных таблицах и не беспорядочных R-результатах. Если бы я собирался сделать это всего несколько раз, я мог бы просто делать все анализы как одиночные регрессии, а затем использовать sjt.glm для создания хороших таблиц. Хотя, повторяя подобные подобные анализы снова и снова, я использую петли, чтобы ускорить и упростить процесс. К сожалению, я не могу сделать lappply и sjt.glm сотрудничать. Оптимально я бы просто взял результаты из цикла lapply и сделал одну красивую горизонтально выровненную таблицу с sjt.glm.

Смотрите пример (и извините за уродливое кодирование)

library(sjPlot) 
    swiss$y1 <- ifelse(swiss$Fertility < median(swiss$Fertility), 0, 1) 
    swiss$y2 <- ifelse(swiss$Infant.Mortality < median(swiss$Infant.Mortality), 0, 1) 
    swiss$y3 <- ifelse(swiss$Agriculture < median(swiss$Agriculture), 0, 1) 

    #Normal slow way would be 
    fitOR1 <- glm(y1 ~ Education + Examination + Catholic, data = swiss, 
     family = binomial(link = "logit")) 
    fitOR2 <- glm(y2 ~ Education + Examination + Catholic, data = swiss, 
      family = binomial(link = "logit")) 
    fitOR3 <- glm(y3 ~ Education + Examination + Catholic, data = swiss, 
      family = binomial(link = "logit")) 

    #and then simply use summary and other formulas to look at the results 
    summary(fitOR1);exp(cbind(OR = coef(fitOR1), confint(fitOR1))) 

    #but with 20+ dependents, this would become tedious 

    #Doing the same analysis as a laply loop, is relatively easy (and non-tedious) 
    varlist <- names(swiss[c(7:9)]) 

    results <- lapply(varlist, function(x){ 
     glm(substitute(i ~ Education + Examination + Catholic, list(i=as.name(x))), 
    family =binomial, data = swiss)}) 

    for (i in 1:3) print(summary(results[[i]])) 
    for (i in 1:3) print(exp(cbind(OR = coef(results[[i]]), confint(results[[i]])))) 

    #Though here is the catch. To get the output/results into a nice table 
    #I can easily use sjt.glm for the "standard" single logistic regressions. 
    sjt.glm(fitOR1,fitOR2,fitOR3, file = "SwissFits.html") 

    #Though I can't think of how I could do this for the loop-results. 
    #The closest I have come is perhaps something like 
    for(i in 1:3)(sjt.glm(results[[i]],file="LoopSwissFits.html")) 

    #but then I only get the results from the last regression. 

    #One alternative is to do 
    lapply(varlist,function(x){ sjt.glm(
     glm(substitute(i ~ Education + Examination + Catholic, list(i=as.name(x))), 
    family =binomial, data = swiss), file = paste0("SwissFits_",(i=as.name(x)),".html"))}) 

    #but then I get three separate files, when it would be preferable to 
    #have the results in one horizontally oriented file 

У любых из вас есть аккуратное и элегантное решение моей проблемы?

спасибо, что заблаговременно!

+0

'do.call (what = sjt.glm, args = c (results, file =" LoopSwissFits.html "))'? – Gregor

+0

Работает ли это для вас? Когда я запускаю его, я получаю только Ошибка в eval (x $ expr, data, x $ env): имена переменных ограничены 10000 байтами – TAH

ответ

1

Пакет stargazer хорошо подходит для этого. Используйте функцию записи для сохранения результатов в текстовом файле. Для отображения в консоли, просто потребительной

install.packages("stargazer") 
library(stargazer) 

stargazer(results, align = TRUE, type = "text") 

# To write to a word file 
write(stargazer(results, align = TRUE, type = "text"), "results.txt") 
+0

Привет, см. Мой длинный комментарий, отправленный как «ответ». – TAH

1

Просто поместите список в качестве первого аргумента: sjt.glm(results).

+0

Это сработало! И прямо сейчас я краснею смущения в своем офисе! Большое спасибо! Я понятия не имею, почему я просто не пробовал это сам .... – TAH

0

@code_is_entropy.

Stargazer замечательный, но при добавлении expcoef = T он дает неправильные CI, и, к сожалению, я не знаю, как исправить это при использовании цикла lapply. См пример

library(stargazer);library(sjPlot) 
mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv") 
varlist <- names(mydata[c(2:4)]) 
results <- lapply(varlist, function(x){ 
glm(substitute(admit ~i, list(i=as.name(x))), 
    family =binomial, data = mydata)}) 

stargazer(results, apply.coef = exp, align = TRUE, 
column.labels = varlist, model.names = T, ci = T, type = "text") 
#vs 
sjt.glm(results,digits.est = 5, digits.ci = 5,p.numeric = T, digits.p=5) 
#vs 
for (i in 1:3)print (exp(confint(results[[i]]))) 

Так что, если вы сравните результаты результатов от ехр (confint), sjt.glm и Звездочет вы видите доверительные интервалы, Звездочет являются просто далеко.

К сожалению, для отправки ответа в качестве комментария я просто должен был превысить количество букв, чтобы привести пример.