Как добавить коэффициенты, SE, доверительные интервалы и отношения шансов в таблицу звездочета?

Предыдущий пользователь спросил Как мне добавить доверительные интервалы к отношениям шансов в таблице звездочета? и наметили четкое решение проблемы.

В настоящее время я печатаю свои таблицы вручную, что отнимает очень много времени. пример моей напечатанной таблицы. Вот ссылка на используемый файл .txt.

Моя модель имеет размер как зависимую переменную (категориальную) и пол (категориальный), возраст (непрерывный) и год (непрерывный) как независимые переменные. Я использую mlogit для моделирования взаимосвязи между переменными.

Код, который я использовал для модели, выглядит следующим образом:

tattoo <- read.table("https://ndownloader.figshare.com/files/6920972", 
                      header=TRUE, na.strings=c("unk", "NA"))    

library(mlogit)

Tat<-mlogit.data(tattoo, varying=NULL, shape="wide", choice="size", id.var="date")

ml.Tat<-mlogit(size~1|age+sex+yy, Tat, reflevel="small", id.var="date")

library(stargazer)

OR.vector<-exp(ml.Tat$coef)
CI.vector<-exp(confint(ml.Tat))
p.values<-summary(ml.Tat)$CoefTable[,4]

#table with odds ratios and confidence intervals
stargazer(ml.Tat, coef=list(OR.vector), ci=TRUE, ci.custom=list(CI.vector), single.row=T, type="text", star.cutoffs=c(0.05,0.01,0.001), out="table1.txt", digits=4)

#table with coefficients and standard errors
stargazer(ml.Tat, type="text", single.row=TRUE, star.cutoffs=c(0.05,0.01,0.001), out="table1.txt", digits=4) 

Код stargazer, который я пробовал, показан ниже для небольшой части моих данных:

library(stargazer)
OR.vector<-exp(ml.Tat$coef)
CI.vector<-exp(confint(ml.Tat))
p.values<-summary(ml.Tat)$CoefTable[,4] #incorrect # of dimensions, unsure how to determine dimensions
stargazer(ml.Tat, coef=list(OR.vector), ci=TRUE, ci.custom=list(CI.vector), single.row=T, type="text", star.cutoffs=c(0.05,0.01,0.001), out="table1.txt", digits=4) #gives odds ratio (2.5%CI, 97.5%CI)

Выходные данные отношения шансов и доверительного интервала:  шансы и CI

stargazer(ml.Tat, type="text", single.row=TRUE, star.cutoffs=c(0.05,0.01,0.001), out="table1.txt", digits=4) #gives coeff (SE)`

Коэффициент и вывод SE:  coeff and SE output

Я могу комбинировать отношения шансов с доверительными интервалами или стандартными ошибками или коэффициенты с доверительными интервалами и стандартными ошибками, но когда я пишу все три вместе, функция ci=TRUE, кажется, перезаписывает значение SE по умолчанию.

Для моей диссертации мне нужны таблицы, чтобы показать коэффициенты, стандартные ошибки, доверительные интервалы и отношения шансов (и p-значения в некотором формате). Есть ли способ у звездочета включить все четыре вещи? Возможно, в двух разных столбцах? Я могу экспортировать таблицы в Excel, однако без всех четырех вещей в одной и той же таблице звездочета я застрял вручную, соединяя две приведенные выше таблицы вместе. Это не имеет большого значения для 1 таблицы, но я работаю с 36 моделями, всем которым нужны таблицы (для моей диссертации).

Как с помощью звездочета показать все четыре вещи? (отношение шансов, доверительные интервалы, коэффициенты и стандартные ошибки)


person Blundering Ecologist    schedule 20.11.2016    source источник
comment
Вам необходимо представить объекты данных, созданные с помощью кода R. (Это тоже лишнее представление.)   -  person IRTFM    schedule 20.11.2016
comment
@ 42- Надеюсь, что добавленный код и скриншоты помогли прояснить мои трудности.   -  person Blundering Ecologist    schedule 20.11.2016
comment
Что ж, они предлагают довольно небольшое количество событий. И это немного непривычно - иметь 2 перехвата. Мы по-прежнему не можем дать советы по кодированию, так как данных по-прежнему нет.   -  person IRTFM    schedule 20.11.2016
comment
Я добавил свои данные через figshare и немного уточнил данные в тексте.   -  person Blundering Ecologist    schedule 20.11.2016
comment
Похоже, что звездочет - не лучший способ извлекать все эти значения сразу. (Возможно, автор согласен со мной, что они будут избыточными.) Похоже, вы можете использовать другую программу регрессии, отличную от glm. Я не думаю, что он может создать такую ​​модель. У меня есть загруженные данные, и фрейм данных показывает 18 171 строку с переменной размера, имеющей 4 уровня, поэтому я предполагаю, что вы исключили 9 случаев unk. Если вы хотите получить конкретный ответ на эту проблему, вам необходимо включить код обработки и моделирования данных.   -  person IRTFM    schedule 20.11.2016
comment
Предупреждение: средство загрузки, использованное в вопросе, использовало средства браузера для отображения поддельного всплывающего сообщения о необходимости проверки на вирусы.   -  person IRTFM    schedule 20.11.2016
comment
@ 42- Я исключил из анализа unk (неизвестных) случаев. Я обновил свой вопрос кодом, который использовал. Если бы вы могли сообщить мне, что подразумевается под обработкой данных (все еще изучая веревки!), Я могу добавить и это.   -  person Blundering Ecologist    schedule 20.11.2016
comment
stargazer принимает несколько моделей и включает их в отдельные столбцы. Поэтому создайте вторую модель (например, ml.TatOR) и замените коэффициенты отношениями шансов. Затем в Stargazer включите обе модели и соответствующие аргументы: stargazer(ml.Tat, ml.TatOR, type="text",ci = c(F,T),column.labels=c("coefficients","odds ratio"), single.row=TRUE)   -  person paqmo    schedule 20.11.2016
comment
@paqmo Если я правильно понимаю, я мог бы дважды закодировать свою модель ml.Tat, чтобы в stargazer выводе были показаны четыре вещи, которые мне нужны в моей таблице? Моя текущая модель выглядит как ml.Tat<-mlogit(size~1|age+sex+yy, Tat, reflevel="small", id.var="date"), и я ничего не уточняю о выходе модели. Как перейти от вывода, который показывает коэффициенты и стандартные ошибки, к отношениям шансов и доверительным интервалам?   -  person Blundering Ecologist    schedule 20.11.2016
comment
Включите вторую модель: ml.TatOR <-mlogit(size~1|age+sex+yy, Tat, reflevel="small", id.var="date"). Заменить коэффициенты отношениями шансов: ml.TatOR$coef <- exp(ml.TatOR$coef). Затем поместите обе модели в свой stargazer вызов, как указано выше. Аргумент ci = c(F,T) подавляет доверительный интервал в первом столбце, но не во втором.   -  person paqmo    schedule 20.11.2016


Ответы (2)


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

tattoo <- read.table("https://ndownloader.figshare.com/files/6920972", 
                  header=TRUE, na.strings=c("unk", "NA"))    

library(mlogit)

Tat<-mlogit.data(tattoo, varying=NULL, shape="wide", choice="size", id.var="date")

ml.Tat<-mlogit(size~1|age+sex+yy, Tat, reflevel="small", id.var="date")
ml.TatOR<-mlogit(size~1|age+sex+yy, Tat, reflevel="small", id.var="date")
ml.TatOR$coefficients <- exp(ml.TatOR$coefficients) #replace coefficents with odds ratios

library(stargazer)
stargazer(ml.Tat, ml.TatOR, ci=c(F,T),column.labels=c("coefficients","odds ratio"),
          type="text",single.row=TRUE, star.cutoffs=c(0.05,0.01,0.001),
          out="table1.txt", digits=4)

Аргумент ci=c(F,T) подавляет доверительный интервал в первом столбце (поэтому вместо него отображаются SE) и показывает его во втором столбце. Аргумент column.labels позволяет вам давать имена столбцам.

====================================================================
                                  Dependent variable:               
                   -------------------------------------------------
                                         size                       
                        coefficients              odds ratio        
                            (1)                      (2)            
--------------------------------------------------------------------
large:(intercept)  -444.6032*** (22.1015) 0.0000 (-43.3181, 43.3181)
medium:(intercept) -187.9871*** (11.9584) 0.0000 (-23.4381, 23.4381)
large:age            0.0251*** (0.0041)   1.0254*** (1.0174, 1.0334)
medium:age           0.0080** (0.0026)    1.0081*** (1.0030, 1.0131)
large:sexM           1.3818*** (0.0607)   3.9821*** (3.8632, 4.1011)
medium:sexM          0.7365*** (0.0330)   2.0886*** (2.0239, 2.1534)
large:yy             0.2195*** (0.0110)   1.2455*** (1.2239, 1.2670)
medium:yy            0.0931*** (0.0059)   1.0976*** (1.0859, 1.1093)
--------------------------------------------------------------------
Observations               18,162                   18,162          
R2                         0.0410                   0.0410          
Log Likelihood          -15,882.7000             -15,882.7000       
LR Test (df = 8)       1,357.1140***            1,357.1140***        
====================================================================
Note:                                  *p<0.05; **p<0.01; ***p<0.001
person paqmo    schedule 20.11.2016
comment
Спасибо, что испытали трудности с написанием кода. Я ценю ваше терпение и вашу помощь. Ваше решение полностью ответило на мой вопрос. - person Blundering Ecologist; 21.11.2016
comment
Я использовал приведенный выше код, и по какой-то причине мои результаты для обоих столбцов одинаковы (то есть коэффициент повторяется во втором столбце вместо того, чтобы показывать отношение шансов). Например, для large:age это одновременно 0.0251*** под коэффициентами и отношением шансов. Может быть, в приведенном выше коде есть ошибка или эта ошибка специфична для моей консоли R? - person Blundering Ecologist; 21.11.2016
comment
Большое спасибо! Вы сэкономили мне столько времени, так как раньше я все делал вручную. Опять же, я ценю, что вы нашли время помочь мне с этим. Всего наилучшего! - person Blundering Ecologist; 21.11.2016

Попытка извлечь эти ценности из звездочета будет болезненной. Возвращаемое значение из вызовов звездочета - это просто строки символов. Вместо этого вам следует взглянуть на структуру модели. Это похоже на структуру glm результатов:

> names(ml.Tat)
 [1] "coefficients"  "logLik"        "gradient"      "hessian"      
 [5] "est.stat"      "fitted.values" "probabilities" "residuals"    
 [9] "omega"         "rpar"          "nests"         "model"        
[13] "freq"          "formula"       "call"      

И результаты summary.mlogit похожи на результаты summary.glm:

> names(summary(ml.Tat))
 [1] "coefficients"  "logLik"        "gradient"      "hessian"      
 [5] "est.stat"      "fitted.values" "probabilities" "residuals"    
 [9] "omega"         "rpar"          "nests"         "model"        
[13] "freq"          "formula"       "call"          "CoefTable"    
[17] "lratio"        "mfR2"         

Таким образом, вы должны использовать значения [['CoefTable']], которые, скорее всего, представлены в форме матрицы ... поскольку они должны быть аналогичны значению коэффициентов summary (mod) $.

> summary(ml.Tat)$CoefTable
                        Estimate   Std. Error     t-value     Pr(>|t|)
large:(intercept)  -444.39366673 2.209599e+01 -20.1119625 0.000000e+00
medium:(intercept) -187.91353927 1.195601e+01 -15.7170716 0.000000e+00
unk:(intercept)     117.92620950 2.597647e+02   0.4539731 6.498482e-01
large:age             0.02508481 4.088134e-03   6.1360059 8.462202e-10
medium:age            0.00804593 2.567671e-03   3.1335519 1.727044e-03
unk:age               0.01841371 4.888656e-02   0.3766620 7.064248e-01
large:sexM            1.38163894 6.068763e-02  22.7663996 0.000000e+00
medium:sexM           0.73646230 3.304341e-02  22.2877210 0.000000e+00
unk:sexM              1.27203654 7.208632e-01   1.7646018 7.763071e-02
large:yy              0.21941592 1.098606e-02  19.9722079 0.000000e+00
medium:yy             0.09308689 5.947246e-03  15.6521007 0.000000e+00
unk:yy               -0.06266765 1.292543e-01  -0.4848399 6.277899e-01

Теперь должен быть свободен путь к выполнению домашнего задания.

person IRTFM    schedule 20.11.2016
comment
Спасибо @ 42-. Ваша помощь очень ценится. Если бы это было домашнее задание! На самом деле я работаю над докторской степенью. - person Blundering Ecologist; 20.11.2016
comment
Я должен уточнить: это решение позволяет мне видеть результат (что имеет смысл), однако я полагаю, что ответ может заключаться в том, что невозможно иметь таблицу звездочета, в которой есть все 4 вещи (отношение шансов, доверительные интервалы, коэффициенты, и стандартные ошибки). Я использую stargazer как инструмент для эффективного и эстетичного экспорта моих данных в Excel (у меня 36 таблиц данных), так что мне кажется, что мне, возможно, придется скопировать и вставить их вместе? - person Blundering Ecologist; 20.11.2016
comment
Должно быть довольно легко построить единственную функцию, которая предоставляет метод печати для cbind этого результата с помощью exp (coef), exp (coef + 1.96 * se) и coef (coef-1.96 * se). Затем используйте эту функцию на каждой из 36 моделей с циклом for. Я действительно удивлен, что звездочет не может с этим справиться. Я думал, что это матричный метод. Причина, по которой я подумал, что это домашнее задание, заключается в том, что вчера был еще один вопросник с очень похожей спецификацией модели mlogit. Я думал, что совпадение было крайне маловероятным (но, полагаю, квантово-механически возможным). - person IRTFM; 21.11.2016
comment
Я понимаю что ты имеешь ввиду. Тем не менее, решение, предложенное другим пользователем, помогло быстро исправить. Похоже, я неправильно настроил модель в Stargazer. Я задал вопрос ранее в Cross Validated о правильной интерпретации отношений шансов на выходе mlogit, возможно, это то, что вы читаете? В любом случае, еще раз спасибо за вашу помощь. Это очень ценится! - person Blundering Ecologist; 21.11.2016