optimとglmの残留標準誤差の違い


16

私はoptim、R関数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) 

optimで見積もる

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

ここで、は不偏推定量であり、MLEではありません。見るσ^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    ...

これは、条件とする観測された逆フィッシャー情報です。これで、計算した逆観測フィッシャー情報は、トリプレットます。つまり、不偏推定量ではなく、のMLEを使用します。したがって、標準エラーはファクタまたは類似したものによって異なるはずです。これはそうですβ0β1σ^2β0β1σσn/n3+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

usr11852の要求に応じてさらに詳しく説明すると、対数尤度は

lβσ=n2ログ2πnログσ12σ2yバツβyバツβ

ここで、は設計行列、は観測数です。その結果、観測された情報行列はバツn

ββlβσ=1σ2バツバツ

次のように、MLEまたは unbaised推定量をプラグインできます。σ

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

次に、使用するガウスの例の標準誤差を拡大する必要があります。


1
+1。あなたが完全に正しいとは思っていませんが、これは間違いなく正しい方向です。その要因を期待する理由を説明できますか?
usεr11852が復活モニック言う

今より明確ですか?
ベンジャミンクリストファーセン

1
はい。いい答えです!(私はすでにそれをupvoted)
usεr11852は回復モニック言う

1

私がよく理解していれば、解決策は簡単です。optim二乗残差の合計をで割ることにより、尤度を最大化します。必要なのは、二乗和をで除算することです。したがって、による除算を元に戻し、除算します。n k + 1 n n k + 1nnk+1nnk+1sqrt(4.717216^2*4/2) = 6.671151


1
お返事をありがとうございます。私の質問が十分に明確ではなかったことに気づきました(編集しました)。残差標準誤差の計算だけでなく、パラメーターの標準誤差も再現したい
ジル

@Gilles標準エラーを再現する方法がわかりません。違いは次のとおりです。1. glmはフィッシャー情報マトリックスを使用し、ヘッセ行列は最適、2。glmはこれを2パラメーターの問題(b0とb1を見つける)、optimは3パラメーターの問題(b0、b1、sigma2)と見なします。これらの違いを埋めることができるかどうかはわかりません。
papgeo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.