회귀 분석에서 계수의 표준 오차는 어떻게 계산됩니까?


114

내 자신의 이해를 위해, 예를 들어의 lm()함수 출력과 함께 추정 계수의 표준 오차 계산을 수동으로 복제하는 데 관심이 R있지만 핀을 고정시킬 수는 없었습니다. 사용 된 공식 / 구현물은 무엇입니까?


8
좋은 질문은 많은 사람들이 선형 대수의 관점에서 회귀를 알고 있다는 것입니다. 여기서 선형 방정식 대한 답을 얻습니다. 왜 우리에게 표준 오류와 가정이 있는지 명확하지 않습니다. XXβ=Xy
Haitao Du

답변:


122

선형 모델은 여기서 는 반응의 벡터를 나타내고, 는 고정 효과 매개 변수의 벡터이며, 는 열이 설명 변수의 값인 해당 설계 행렬이며 은 임의 오류의 벡터입니다. y β X ϵ

|y=Xβ+ϵϵN(0,σ2I),
yβXϵ

의 추정치는 ( wikipedia 기사 참조 ) 따라서 [알림 : , 일부 랜덤 벡터 및 일부 비 랜덤 행렬 ]β = ( X ' X ) - 1 X ' , Y . 바르 ( β ) = ( X ' X ) - 1 X 'β

β^=(XX)1Xy.
바르 ( X는 ) = × 바르 ( X ) × ' X
Var(β^)=(XX)1Xσ2IX(XX)1=σ2(XX)1,
Var(AX)=A×Var(X)×AXA

그래서 여기서 는 ANOVA 테이블의 MSE (Mean Square Error)에 의해 얻을 수 있습니다. σ (2)

Var^(β^)=σ^2(XX)1,
σ^2

R에서 간단한 선형 회귀가있는 예

#------generate one data set with epsilon ~ N(0, 0.25)------
seed <- 1152 #seed
n <- 100     #nb of observations
a <- 5       #intercept
b <- 2.7     #slope

set.seed(seed)
epsilon <- rnorm(n, mean=0, sd=sqrt(0.25))
x <- sample(x=c(0, 1), size=n, replace=TRUE)
y <- a + b * x + epsilon
#-----------------------------------------------------------

#------using lm------
mod <- lm(y ~ x)
#--------------------

#------using the explicit formulas------
X <- cbind(1, x)
betaHat <- solve(t(X) %*% X) %*% t(X) %*% y
var_betaHat <- anova(mod)[[3]][2] * solve(t(X) %*% X)
#---------------------------------------

#------comparison------
#estimate
> mod$coef
(Intercept)           x 
   5.020261    2.755577 

> c(betaHat[1], betaHat[2])
[1] 5.020261 2.755577

#standard error
> summary(mod)$coefficients[, 2]
(Intercept)           x 
 0.06596021  0.09725302 

> sqrt(diag(var_betaHat))
                    x 
0.06596021 0.09725302 
#----------------------

단일 설명 변수가있는 경우 모형은 및 되도록 수식이 더 투명 해집니다. 예를 들어 예상 경사의 표준 오차는 X = ( 1 x 1 1 x 21 x n ) ,

yi=a+bxi+ϵi,i=1,,n
( X ' X ) 1 = 1
X=(1x11x21xn),β=(ab)
(XX)1=1nxi2(xi)2(xi2xixin)
Var^(b^)=[σ^2(XX)1]22=nσ^2nxi2(xi)2.
> num <- n * anova(mod)[[3]][2]
> denom <- n * sum(x^2) - sum(x)^2
> sqrt(num / denom)
[1] 0.09725302

철저한 답변에 감사드립니다. 다변량 사례에서 마지막 공식이 유지하지 않는 이유는 무엇입니까?
ako

1
아니요, 마지막 공식은 단순 선형 모델의 특정 X 행렬에만 적용됩니다. 다변량의 경우 위에 주어진 일반 식을 사용해야합니다.
ocram December

4
+1, 빠른 질문, 는 어떻게됩니까? Var(β^)
아보카도

6
@loganecolss : 임의의 벡터 와 비 랜덤 행렬 라는 사실에서 비롯됩니다 . X AVar(AX)=AVar(X)AXA
ocram

4
이러한 손 계산을위한 정답이 있지만 내에서 사용되는 실제 구현 있습니다 lm.fit/이 summary.lm... 안정성과 효율성을 위해 조금 다르다
벤 Bolker

26

이에 대한 공식은 통계에 관한 중간 텍스트에서 찾을 수 있습니다. 특히 다음 연습이 수행 되는 Sheather (2009, 5 장) 에서 찾을 수 있습니다 (138 페이지).

다음 R 코드는 계수 추정값과 표준 오류를 수동으로 계산합니다.

dfData <- as.data.frame(
  read.csv("http://www.stat.tamu.edu/~sheather/book/docs/datasets/MichelinNY.csv",
                   header=T))

# using direct calculations
vY <- as.matrix(dfData[, -2])[, 5]                        # dependent variable
mX <- cbind(constant = 1, as.matrix(dfData[, -2])[, -5])  # design matrix

vBeta <- solve(t(mX)%*%mX, t(mX)%*%vY)                    # coefficient estimates
dSigmaSq <- sum((vY - mX%*%vBeta)^2)/(nrow(mX)-ncol(mX))  # estimate of sigma-squared
mVarCovar <- dSigmaSq*chol2inv(chol(t(mX)%*%mX))          # variance covariance matrix
vStdErr <- sqrt(diag(mVarCovar))                          # coeff. est. standard errors
print(cbind(vBeta, vStdErr))                              # output

출력을 생성

                         vStdErr
constant   -57.6003854 9.2336793
InMichelin   1.9931416 2.6357441
Food         0.2006282 0.6682711
Decor        2.2048571 0.3929987
Service      3.0597698 0.5705031

의 출력과 비교하십시오 lm().

# using lm()
names(dfData)
summary(lm(Price ~ InMichelin + Food + Decor + Service, data = dfData))

출력을 생성합니다.

Call:
lm(formula = Price ~ InMichelin + Food + Decor + Service, data = dfData)

Residuals:
    Min      1Q  Median      3Q     Max 
-20.898  -5.835  -0.755   3.457 105.785 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -57.6004     9.2337  -6.238 3.84e-09 ***
InMichelin    1.9931     2.6357   0.756    0.451    
Food          0.2006     0.6683   0.300    0.764    
Decor         2.2049     0.3930   5.610 8.76e-08 ***
Service       3.0598     0.5705   5.363 2.84e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 13.55 on 159 degrees of freedom
Multiple R-squared: 0.6344, Adjusted R-squared: 0.6252 
F-statistic: 68.98 on 4 and 159 DF,  p-value: < 2.2e-16 

solve()기능 과 함께 좋은 트릭 . 이것은 행렬 대수가 없으면 상당히 길어질 것입니다. 기본 연산자만으로 특정 라인을 수행하는 간결한 방법이 있습니까?
ako

1
@AkselO OLS 추정기에 대해 잘 알려진 닫힌 양식 표현식이 있습니다. 은 행렬 의 역수를 명시 적으로 계산하여 계산할 수 있지만 @ ocram이 수행 한 것처럼) 조건이 잘못된 행렬에서는 까다로울 수 있습니다. β^=(XX)1XY(XX)
tchakravarty

0

Ocram의 답변 중 일부가 잘못되었습니다. 사실은:

β^=(XX)1Xy(XX)1Xϵ.

이자형(β^)=(엑스'엑스)1엑스'와이.

첫 번째 답변에 대한 의견은 계수 분산에 대한 추가 설명이 필요하다는 것을 보여줍니다.

바르(β^)=이자형(β^이자형(β^))2=바르((엑스'엑스)1엑스'ϵ)=(엑스'엑스)1엑스'σ2나는엑스(엑스'엑스)1=σ2(엑스'엑스)1


편집하다

감사합니다. 는 베타 버전의 모자를 무시했습니다. 위의 공제는 입니다. 올바른 결과는 다음과 같습니다.아르 자형영형와이아르 자형영형

1.(이 식을 얻기 위해의 1 차 도함수 설정 에 maxmizing를 들어 제로인 )β^=(엑스'엑스)1엑스'와이.에스에스아르 자형β에스에스아르 자형

2.이자형(β^|엑스)=이자형((엑스'엑스)1엑스'(엑스β+ϵ)|엑스)=β+((엑스'엑스)1엑스')이자형(ϵ|엑스)=β.

3.바르(β^)=이자형(β^이자형(β^|엑스))2=바르((엑스'엑스)1엑스'ϵ)=(엑스'엑스)1엑스'σ2나는엑스(엑스'엑스)1=σ2(엑스'엑스)1

잘하면 도움이됩니다.


1
베타 벡터에 대한 OLS 추정 은 괜찮은 회귀 식 교과서에서 찾을 수 있습니다. 이를 고려하여 대신? β =(X'X)-1X', Y-(X'X)-1X'εβ^=(엑스'엑스)1엑스'와이β^=(엑스'엑스)1엑스'와이(엑스'엑스)1엑스'ϵ
gung

4
귀하의 때문이 아니라 심지어 추정이다 관찰되지 않습니다! εβ^ϵ
whuber

이 비디오에서 볼 수 있습니다 : youtube.com/watch?v=jyBtfhQsf44
StatsStudent
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.