glm и относительный риск-репликация кода Stata в R
Может ли кто-нибудь помочь мне воспроизвести эти расчеты относительного риска (и его доверительный интервал) в R?
Аналогичная процедура, используемая в Stata, описаназдесь . Может ли кто-нибудь показать мне, как это сделать в R (мои данные имеют кластеры и слои, но я взял более простой пример)? Я уже пробовал релриск.функция est, но я бы предпочел использовать пакет обследования, поскольку он обрабатывает очень сложные конструкции. Я также хотел бы сравнить оценки Stata и R.Я использую Пуассона, как предложил здесь.
###STATA CODE
use http://www.ats.ucla.edu/stat/stata/faq/eyestudy
tabulate carrot lenses
*same as R binomial svyglm below
xi: glm lenses carrot, fam(bin)
*switch reference code
char carrot[omit] 1
xi: glm lenses i.carrot, fam(poisson) link(log) nolog robust eform
###R
library(foreign)
library(survey)
D<-read.dta("http://www.ats.ucla.edu/stat/stata/faq/eyestudy.dta")
table(D$lenses,D$carrot)
D$wgt<-rep(1,nrow(D))
Dd<-svydesign(id=~1,data=D,weights=~wgt)
#change category and eform....?
svyglm(lenses~carrot,Dd,family=binomial)
svyglm(lenses~carrot,Dd,family=quasipoisson(log))
1 ответ:
Ваш пример-это простой набор данных, поэтому вам не нужно использовать пакет опроса вообще. Я бы также предложил, чтобы при изучении множественной регрессии с помощью R вы начинали с более простых примеров и постепенно наращивали свое понимание используемых методов.
В конце концов, мое мнение состоит в том, что философии Stata и R различаются. Стата легко бросает тонну информации в ваше лицо, без того, чтобы вы знали, что это означает или как оно получено. С другой стороны R может быть так же (или даже больше) мощный и более универсальный, но лишенный "автоматизации" Stata и вынуждающий вас идти медленно, чтобы получить желаемые результаты.Вот более буквальный перевод вашего кода Stata:
Обратите внимание, чтоrequire(foreign) data <- read.dta("http://www.ats.ucla.edu/stat/stata/faq/eyestudy.dta") with(data, table(carrot, lenses)) glm.out.1 <- glm(lenses ~ carrot, family="binomial", data=data) summary(glm.out.1) logLik(glm.out.1) # get the log-likelihood for the model, as well glm.out.2 <- glm(lenses ~ factor(carrot, levels=c(1,0)), family="poisson"(link="log"), data=data) summary(glm.out.2) logLik(glm.out.2) exp(cbind(coefficients(glm.out.2), confint(glm.out.2))) # deriving robust estimates. vcovHC() is in the sandwich package. require(sandwich) robSE <- sqrt(diag(vcovHC(glm.out.2, type="HC")))[2] rob <- coef(glm.out.2)[2] rob <- exp(c(rob, rob+qnorm(0.025)*robSE, rob-qnorm(0.025)*robSE)) names(rob) <- c("", "2.5 %", "97.5 %") rob
(link="log")
во втором вызовеglm()
не требуется, поскольку это функция связи по умолчанию, когдаfamily="poisson"
.Для получения "надежных" оценок мне пришлось прочитать это, что было очень полезно. Вы должны использовать функцию
"Надежные" оценки были почти идентичны тому, что я получил от Stata, вплоть до третьего десятичного знака. Все остальные результаты были полностью идентичны; запустите код и убедитесь сами.vcovHC()
в пакете сэндвича, чтобы получить другой матрица дисперсии-ковариации, чем та, что вычисляется поglm()
, и использовать ее для вычисления стандартной ошибки и оценки параметров.О, и еще одна вещь: когда вы находите свой путь с помощью glm() с нестратифицированными конструкциями, затем сопоставьте свой путь через пакет
survey
, который содержит аналоги этого и другие функции анализа, модифицированные для сложных конструкций. Я также рекомендую вам прочитать книгу Томаса Ламли "комплексные опросы: руководство по анализу с использованием R".