надежная и кластеризованная Стандартная ошибка в R для регрессии probit и logit

Первоначально я в основном хочу запустить модель probit / logit с кластеризованной стандартной ошибкой в R, которая довольно интуитивно понятна в Stata. Я наткнулся с ответом здесь логистическая регрессия с надежными кластеризованными стандартными ошибками в R. Поэтому я попытался сравнить результат от Stata и от R как с надежной стандартной ошибкой, так и с кластеризованной стандартной ошибкой. Но я заметил, что выходы для обеих стандартных ошибок в программном обеспечении не совсем одинаковы. Однако, если я используйте метод, предложенный здесь https://diffuseprior.wordpress.com/2012/06/15/standard-robust-and-clustered-standard-errors-computed-in-r/ - ... Я могу получить точный результат как из R, так и из Stata для линейной регрессии. Поэтому я боюсь, что код, который я написал в R, неверен и какую команду использовать, если я хочу запустить модель probit вместо модели logit.Или если есть какие-либо элегантные Альтернативы для решения этой проблемы? Спасибо.

R код

## 1. linear regression
library(rms) 
# model<-lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width,iris)
summary(model)
fit=ols(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width, x=T, y=T, data=iris)
fit
robcov(fit) #robust standard error
robcov(fit, cluster=iris$Species) #clustered standard error


## 2. logistic regression
##demo data generation   
set.seed(1234)
subj<-rep(1:20,each=4)
con1<-rep(c(1,0),40)
con2<-rep(c(1,1,0,0),20) 
effect<-rbinom(80,1,0.34)
data<-data.frame(subj,con1,con2,effect)
library(foreign);write.dta(data,'demo_data.dta')

library(rms)
fit=lrm(effect ~ con1 + con2, x=T, y=T, data=data)
fit
robcov(fit)  ##robust standard error
robcov(fit, cluster=data$subj) ## clustered standard error

Stata код

## 1. linear regression
webuse iris
reg seplen sepwid petlen petwid
reg seplen sepwid petlen petwid,r
reg seplen sepwid petlen petwid,cluster(iris)


## 2. logistic regression

use demo_data,clear
logit effect con1 con2
logit effect con1 con2,r
logit effect con1 con2,cluster(subj)

1 ответов


я предпочитаю sandwich пакет для вычисления надежных стандартных ошибок. Одна из причин-отличная документация. См.vignette("sandwich") который четко показывает все доступные значения по умолчанию и параметры, а также соответствующей статье, которая объясняет, как вы можете использовать ?sandwich с пользовательскими bread и meat для особых случаев.

можно использовать sandwich чтобы выяснить разницу между опциями, которые вы разместили. Разница скорее всего будет степень коррекции свободу. Вот сравнение для простой линейной регрессии:

library(rms)
library(sandwich)

fitlm <-lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width,iris)

#Your Blog Post:
X <- model.matrix(fitlm)
n <- dim(X)[1]; k <- dim(X)[2]; dfc <- n/(n-k)    
u <- matrix(resid(fitlm))
meat1 <- t(X) %*% diag(diag(crossprod(t(u)))) %*% X
Blog <- sqrt(dfc*diag(solve(crossprod(X)) %*% meat1 %*% solve(crossprod(X))))

# rms fits:
fitols <- ols(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width, x=T, y=T, data=iris)
Harrell <- sqrt(diag(robcov(fitols, method="huber")$var))
Harrell_2 <- sqrt(diag(robcov(fitols, method="efron")$var))

# Variations available in sandwich:    
variations <- c("const", "HC0", "HC1", "HC2","HC3", "HC4", "HC4m", "HC5")
Zeileis <- t(sapply(variations, function(x) sqrt(diag(vcovHC(fitlm, type = x)))))
rbind(Zeileis, Harrell, Harrell_2, Blog)

          (Intercept) Sepal.Width Petal.Length Petal.Width
const       0.2507771  0.06664739   0.05671929   0.1275479
HC0         0.2228915  0.05965267   0.06134461   0.1421440
HC1         0.2259241  0.06046431   0.06217926   0.1440781
HC2         0.2275785  0.06087143   0.06277905   0.1454783
HC3         0.2324199  0.06212735   0.06426019   0.1489170
HC4         0.2323253  0.06196108   0.06430852   0.1488708
HC4m        0.2339698  0.06253635   0.06482791   0.1502751
HC5         0.2274557  0.06077326   0.06279005   0.1454329
Harrell     0.2228915  0.05965267   0.06134461   0.1421440
Harrell_2   0.2324199  0.06212735   0.06426019   0.1489170
Blog        0.2259241  0.06046431   0.06217926   0.1440781
  1. результат записи в блоге эквивалентен HC1. Если запись в блоге похожа на your Stata выход Stata использует HC1.
  2. функция Фрэнка Харрела дает результаты, аналогичные HC0. Насколько я понимаю, это было первое предлагаемое решение, и когда вы просматриваете vignette(sandwich) или статьи, упомянутые в ?sandwich::vcovHC, другие методы имеют несколько лучшие свойства. Они различаются по степени свободы настройки. Также обратите внимание, что вызов robcov(., method = "efron") похож на HC3.

в любом случае, если вы хотите идентичны, используйте HC1 или просто отрегулировать ковариационную матрицу approriately. Ведь посмотрев на vignette(sandwich) для различий между различными версиями вы видите, что вам просто нужно масштабировать с константой, чтобы получить от HC1 to HC0, которое не должно быть слишком сложно. Кстати, обратите внимание, что HC3 или HC4 обычно предпочтительнее из-за более мелких свойств выборки и их поведения при наличии влиятельных наблюдений. Таким образом, вы, вероятно, хотите изменить значения по умолчанию в Stata.

вы можете использовать эти матрицы дисперсии-ковариации, предоставляя их соответствующим функциям, таким как lmtest::coeftest или car::linearHypothesis. Например:

library(lmtest)
coeftest(fitlm, vcov=vcovHC(fitlm, "HC1"))

t test of coefficients:

              Estimate Std. Error t value  Pr(>|t|)    
(Intercept)   1.855997   0.225924  8.2151 1.038e-13 ***
Sepal.Width   0.650837   0.060464 10.7640 < 2.2e-16 ***
Petal.Length  0.709132   0.062179 11.4046 < 2.2e-16 ***
Petal.Width  -0.556483   0.144078 -3.8624 0.0001683 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

для кластерных надежных стандартных ошибок вам придется настроить мясо сэндвича (см. ?sandwich) или поискать функции этого делать. Уже есть несколько источник объяснением на мучительная деталь как to do это с соответствующего коды или функции. У меня нет причин изобретать колесо здесь, поэтому я пропускаю это.

существует также относительно новый и удобный пакет вычислительных кластеров-надежные стандартные ошибки для линейных моделей и обобщенных линейных моделей. См.здесь.