Stata использует наблюдаемый гессиан для своих вычислений, glm.nb()
использует ожидаемый гессиан.Поэтому значение по умолчанию bread()
, используемое функцией sandwich()
, отличается, что приводит к разным результатам.Существуют другие пакеты R, которые используют наблюдаемый гессиан для оценки дисперсии-ковариации (например, gamlss
), но они не предоставляют метод estfun()
для пакета sandwich
.
Следовательно, ниже Iпросто установите выделенную функцию bread_obs()
, которая извлекает оценки ML из объекта negbin
, устанавливает отрицательное логарифмическое правдоподобие, численно вычисляет наблюдаемый гессиан через numDeriv::hessian()
и вычисляет из него «хлеб» (опуская оценкудля log (theta)):
bread_obs <- function(object, method = "BFGS", maxit = 5000, reltol = 1e-12, ...) {
## data and estimated parameters
Y <- model.response(model.frame(object))
X <- model.matrix(object)
par <- c(coef(object), "log(theta)" = log(object$theta))
## dimensions
n <- NROW(X)
k <- length(par)
## nb log-likelihood
nll <- function(par) suppressWarnings(-sum(dnbinom(Y,
mu = as.vector(exp(X %*% head(par, -1))),
size = exp(tail(par, 1)), log = TRUE)))
## covariance based on observed Hessian
rval <- numDeriv::hessian(nll, par)
rval <- solve(rval) * n
rval[-k, -k]
}
С помощью этой функции я могу сравнить вывод sandwich()
(на основе ожидаемого гессиана) с выводом, используя bread_obs()
(на основе наблюдаемого гессиана).
s_exp <- sandwich(mod1)
s_obs <- sandwich(mod1, vcov = bread_obs)
cbind("Coef" = coef(mod1), "SE (Exp)" = sqrt(diag(s_exp)), "SE (Obs)" = sqrt(diag(s_obs)))
## Coef SE (Exp) SE (Obs)
## (Intercept) 1.328 1.259 1.259
## eei -0.044 0.017 0.015
## costofwar_log 0.298 0.160 0.121
## cfughh -0.038 0.015 0.018
## roadskm 0.002 0.001 0.001
## popdensity_log -0.466 0.135 0.207
## tkilled_log 1.095 0.179 0.208
Это все еще имеет небольшие отличия по сравнению со Stata, но, вероятно, это числовые отличия от оптимизации и т. Д.
Если вы создаете новый выделенный метод bread()
для negbin
объектов
bread.negbin <- bread_obs
, тогда метод отправки будет использовать это, если вы выполните sandwich(mod1)
.