Разница остаточных стандартных ошибок между optim и glm

16

Я пытаюсь воспроизвести optimрезультаты простой линейной регрессии, снабженной glmили даже nlsR-функциями.
Оценки параметров одинаковы, но оценка остаточной дисперсии и стандартные ошибки других параметров не одинаковы, особенно при небольшом размере выборки. Я полагаю, что это из-за различий в способе вычисления остаточной стандартной ошибки между подходами максимального правдоподобия и наименьшего квадрата (деление на n или на n-k + 1, см. Ниже в примере).
Из моих чтений в Интернете я понимаю, что оптимизация - не простая задача, но мне было интересно, можно ли простым способом воспроизвести стандартные оценки ошибок glmпри использовании optim.

Имитировать небольшой набор данных

set.seed(1)
n = 4 # very small sample size !
b0 <- 5
b1 <- 2
sigma <- 5
x <- runif(n, 1, 100)
y =  b0 + b1*x + rnorm(n, 0, sigma) 

Оцените с оптими

negLL <- function(beta, y, x) {
    b0 <- beta[1]
    b1 <- beta[2]
    sigma <- beta[3]
    yhat <- b0 + b1*x
    likelihood <- dnorm(y, yhat, sigma)
    return(-sum(log(likelihood)))
}

res <- optim(starting.values, negLL, y = y, x = x, hessian=TRUE)
estimates <- res$par     # Parameters estimates
se <- sqrt(diag(solve(res$hessian))) # Standard errors of the estimates
cbind(estimates,se)


    > cbind(estimates,se)
      estimates         se
b0     9.016513 5.70999880
b1     1.931119 0.09731153
sigma  4.717216 1.66753138

Сравнение с GLM и NLS

> m <- glm(y ~ x)
> summary(m)$coefficients
            Estimate Std. Error   t value    Pr(>|t|)
(Intercept) 9.016113  8.0759837  1.116411 0.380380963
x           1.931130  0.1376334 14.030973 0.005041162
> sqrt(summary(m)$dispersion) # residuals standard error
[1] 6.671833
> 
> summary(nls( y ~ b0 + b1*x, start=list(b0 = 5, b1= 2)))

Formula: y ~ b0 + b1 * x

Parameters:
   Estimate Std. Error t value Pr(>|t|)   
b0   9.0161     8.0760   1.116  0.38038   
b1   1.9311     0.1376  14.031  0.00504 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 6.672 on 2 degrees of freedom

Я могу воспроизвести различные оценки остаточных стандартных ошибок, например:

> # optim / Maximum Likelihood estimate
> sqrt(sum(resid(m)^2)/n)
[1] 4.717698
> 
> # Least squares estimate (glm and nls estimates)
> k <- 3 # number of parameters
> sqrt(sum(resid(m)^2)/(n-k+1))
[1] 6.671833
жилль
источник

Ответы:

9

Проблема в том, что стандартные ошибки происходят из

σ^2(ИксИкс)-1

σ^2summary.lm

summary.lm
#R function (object, correlation = FALSE, symbolic.cor = FALSE, 
#R     ...) 
#R {
#R    z <- object
#R    p <- z$rank
#R    rdf <- z$df.residual
#R    ...
#R    Qr <- qr.lm(object) 
#R    ... 
#R    r <- z$residuals
#R    f <- z$fitted.values
#R    w <- z$weights
#R    if (is.null(w)) {
#R         mss <- if (attr(z$terms, "intercept")) 
#R             sum((f - mean(f))^2)
#R         else sum(f^2)
#R         rss <- sum(r^2)
#R    }
#R    ...
#R    resvar <- rss/rdf
#R    ...
#R    R <- chol2inv(Qr$qr[p1, p1, drop = FALSE])
#R    se <- sqrt(diag(R) * resvar)
#R    ...

(β0,β1)σ^2(β0,β1,σ)σN/(N-3+1)

set.seed(1)
n = 4 # very small sample size !
b0 <- 5
b1 <- 2
sigma <- 5
x <- runif(n, 1, 100)
y =  b0 + b1*x + rnorm(n, 0, sigma) 

negLL <- function(beta, y, x) {
  b0 <- beta[1]
  b1 <- beta[2]
  sigma <- beta[3]
  yhat <- b0 + b1*x
  return(-sum(dnorm(y, yhat, sigma, log = TRUE)))
}

res <- optim(c(0, 0, 1), negLL, y = y, x = x, hessian=TRUE)
estimates <- res$par     # Parameters estimates
(se <- sqrt(diag(solve(res$hessian))))
#R [1] 5.690 0.097 1.653
k <- 3
se * sqrt(n / (n-k+1))
#R [1] 8.047 0.137 2.338

Чтобы более детально проработать запросы usεr11852 , логарифмическая вероятность

L(β,σ)знак равно-N2журнал(2π)-Nжурналσ-12σ2(Y-Иксβ)(Y-Иксβ)

ИксN

-ββL(β,σ)знак равно1σ2ИксИкс

σ

m <- lm(y ~ x)
X <- cbind(1, x)
sqrt(sum(resid(m)^2)/n       * diag(solve(crossprod(X))))
#R                     x 
#R 5.71058285 0.09732149
k <- 3
sqrt(sum(resid(m)^2)/(n-k+1) * diag(solve(crossprod(X))))
#R                   x 
#R 8.0759837 0.1376334 

Мы можем сделать то же самое с разложением QR, как lmи

obj <- qr(X)
sqrt(sum(resid(m)^2)/(n-k+1) * diag(chol2inv(obj$qr)))
#R [1] 8.0759837 0.1376334

Так ответить

Из моих чтений в Интернете я понимаю, что оптимизация - не простая задача, но мне было интересно, можно ли простым способом воспроизвести стандартные оценки ошибок glmпри использовании optim.

тогда вам нужно увеличить стандартные ошибки в примере Gaussian, который вы используете.

Бенджамин Кристофферсен
источник
1
+1. Я не на 100% уверен, что вы все правильно поняли, но это определенно в правильном направлении. Можете ли вы объяснить, почему вы ожидаете этого фактора?
usεr11852 говорит восстановить Monic
Это более понятно сейчас?
Бенджамин Кристофферсен
1
Да. Хороший ответ! (Я уже проголосовал за это)
usεr11852 говорит восстановить Monic
1

Если я правильно понял, решение простое: optimмаксимизирует вероятность, деля сумму квадратов невязок наN, То, что вы хотите, это разделить сумму квадратов наN-К+1, Так что отмените деление наN и разделить на N-К+1: sqrt(4.717216^2*4/2) = 6.671151

papgeo
источник
1
Спасибо за ответ. Я понимаю, что мой вопрос не был достаточно ясен (сейчас я его редактировал). Я хочу не только воспроизвести вычисление остаточной стандартной ошибки, но и стандартные ошибки параметров ...
Жиль
@ Жиль Я не знаю, как воспроизвести стандартные ошибки. Различия заключаются в следующем: 1. glm использует информационную матрицу Фишера, в то время как optim the hessian, и 2. glm считает, что это проблема 2 параметров (найдите b0 и b1), в то время как optim проблема 3 параметров (b0, b1 и sigma2) , Я не уверен, что эти различия можно устранить.
Папгео