R의 lm ()이 교과서와 다른 계수 추정치를 반환하는 이유는 무엇입니까?


13

배경

모델 피팅에 대한 과정에서 첫 번째 예 를 이해하려고합니다 (따라서 간단하게 보일 수 있습니다). 손으로 계산을 수행했으며 예제와 일치하지만 R에서 반복하면 모델 계수가 해제됩니다. 차이점은 모집단 분산 ( )을 사용하는 교과서 때문일 수 있다고 생각 했지만 R은 샘플 분산 ( )을 사용하고있을 수 있지만 계산에서 사용되는 위치를 볼 수는 없습니다. 예를 들어, 어딘가에서 사용하는 경우 메모 의 도움말 섹션은 다음과 같습니다.S 2σ2S2lm()var()var()

분모 n-1이 사용되어 iid 관측치에 대한 (공) 분산의 편견 추정치를 제공합니다.

나는 모두를위한 코드를 보았다 lm()그리고 lm.fit()어느 쪽도 아니의 메이크업을 사용 var()하지만 lm.fit()컴파일 된 C 코드 (로 데이터 전달 z <- .Call(C_Cdqrls, x, y, tol, FALSE)나는에 액세스 할 수 없습니다).

질문

R이 왜 다른 결과를 내는지 설명 할 수 있습니까? 표본과 모집단 분산의 차이가 있어도 계수 추정치가 다른 이유는 무엇입니까?

데이터

학교 학년의 신발 크기를 예측하기 위해 줄을 맞추십시오.

# model data
mod.dat <- read.table(
    text = 'grade shoe
                1    1
                2    5
                4    9'
    , header = T);

# mean
mod.mu  <- mean(mod.dat$shoe);
# variability 
mod.var <- sum((mod.dat$shoe - mod.mu)^2)

# model coefficients from textbook
mod.m  <- 8/3;
mod.b  <- -1;

# predicted values  ( 1.666667 4.333333 9.666667 )
mod.man.pred       <- mod.dat$grade * mod.m + mod.b;
# residuals         ( -0.6666667  0.6666667 -0.6666667 )
mod.man.resid      <- (mod.dat$shoe - mod.man.pred)
# residual variance ( 1.333333 )
mod.man.unexpl.var <- sum(mod.man.resid^2);
# r^2               ( 0.9583333 )
mod.man.expl.var   <- 1 - mod.man.unexpl.var / mod.var;

# but lm() gives different results:
summary(lm(shoe ~ grade, data = mod.dat))
Call:
lm(formula = shoe ~ grade, data = mod.dat)

Residuals:
      1       2       3 
-0.5714  0.8571 -0.2857 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  -1.0000     1.3093  -0.764    0.585
grade         2.5714     0.4949   5.196    0.121

Residual standard error: 1.069 on 1 degrees of freedom
Multiple R-squared:  0.9643,    Adjusted R-squared:  0.9286 
F-statistic:    27 on 1 and 1 DF,  p-value: 0.121

편집하다

벤 Bolker을 보여 주었다 교사 실수를 할 때도 마찬가지로 보인다. R 계산이 올바른 것 같습니다. 이야기의 도덕 : 교사가 진실이라고 말해서 무언가를 믿지 마십시오. 직접 확인하십시오!


2
다시 확인하십시오 mod.m=8/3. 을 설정하면 mod.m=2.5714동일한 것으로 보입니다.
Stat

2
mod.m = 8/3 및 mod.b = -1 계수는 내가 이해하는 한 주석의 어느 곳에서나 계산되지 않으므로 분명하지 않습니다. @Stat이 위에서 언급했듯이 오류는 mod.m을 계산하는 것으로 보입니다.
Juho Kokkala

2
그것은 것을 명심하는 것이 중요합니다 누구나 실수를 할 수 있습니다 - 선생님을, 당신은, 여기에 R 프로그래머 답변자 - 사람. 따라서 의견이 일치하지 않을 때 실수가있을 수있는 부분을 파악하려고 할 때 각 사람을 확인하는 다른 사람의 수를 고려하십시오. lmR 의 함수 의 경우 문자 그대로 수만 명의 사람들이 결과를 다른 것들과 비교하여 결과를 lm확인했으며 코드의 변경 사항이있을 때마다 알려진 예제 와 비교하여 결과를 확인합니다. 여기에 답이 있으면 최소한 몇 사람이 확인할 것입니다 (귀하의 질문은 29 번 봤습니다).
Glen_b-복지 주 모니카

1
@Glen_b 당신의 요점은 실제로 내가 여기에 온 이유입니다. 그런 기본 계산에서 R이 어떻게 잘못 될 수 있는지 이해할 수 없었지만 왜 그들이 다른지 알 수 없었습니다. 소스 코드 주위에서 이벤트가 스누핑되었습니다. 그러나 결국, 미적분 부분이 내 지식의 한계에 있기 때문에 오류는 내가 생각한 마지막 장소에있었습니다. 나는 대답에서 많은 것을 배웠다!
post-hoc

2
예, 왜 다른지 알아내는 것이 중요합니다. 당신이 그것을 해결할 수 없다면 여기에 묻는 것이 합리적입니다. 당신이 생각한 마지막 장소가 가장 먼저 보았던 곳 중 하나 인 이유를 제안하려고했습니다. 나는 한두 번의 사례로 마지막 순간 '간단 화'를 변경함으로써 잡혔다.
Glen_b-복지 주 모니카

답변:


25

저자가 어딘가에 수학적인 실수를 한 것 같습니다.

제곱합 편차를 확장하면

S=((b+m)1)2+((b+2m)5)2+((b+4m)9)2
당신은 을 얻습니다
S=b2+2bm+m2+12b2m+b2+4bm+4m2+2510b20m+b2+8bm+16m2+8118b72m

이것은 로 줄어 듭니다 . 어쨌든 상관없는 상수 항을 제외하고는 저자의 표현과 동일합니다.

3b2+14bm+21m2+10730b94m

이제 우리는 와 에 대한 의 도함수 를 0으로 설정하고 시스템을 해결하여 이를 최소화해야 합니다. Sbm

dS/db=6b+14m303b+7m15=0
dS/dm=14b+42m947b+21m47=0

풀다

b=(157m)/30=7(157m)/3+21m474735=(49/3+21)mm=(4735)/(2149/3)=18/7

R은 이것이 실제로 2.571429라고 말합니다 ...

이 링크를 바탕으로 이것은 Coursera 과정에서 온 것 같습니다 ...? 어딘가에 데이터가 잘못 기록되어 있었습니까?

이 계산을 수행하는 다른 독립적 인 방법은 추정 회귀 기울기가 교차 곱의 합 ( )을 제곱의 합 ( ).(yy¯)(xx¯)(xx¯)2

g <- c(1,2,4)
g0 <- g - mean(g)
s <- c(1,5,9)
s0 <- s- mean(s)
sum(g0*s0)/(sum(g0^2))
## [1] 2.571429

신발 사이즈가 대신 라면 경사 8/3으로 나옵니다.{ 1 , 5 , 9 }{1,11/3,9}{1,5,9}


2
와. 그래 당신 말이 맞아요. 그것은 Coursera 과정에서 온 것이며, 전사가 아닌 비디오에서 온 것입니다. 그래서 그는 비디오 계산을 단순화하기 위해 그것을 단순화하고 누군가가 그것을 반복하려고 시도하지 않을 것이라고 추측합니다. 방금 본 첫 번째 비디오가되어서 따라 가려고했습니다. 수학과 관련하여 기술을 익혀야한다는 것이 분명합니다. 그래도 오류를 발견했다고 생각합니다. 당신이 중요하다고 말하는 상수 항은 아마도 그의 계산을 거친 올바른 값 일 것입니다. 나는 너 자신의 대답을 몇 번 더 살펴보고 나 자신을 가르 칠 것이다. 정말 감사!
post-hoc

나는 상수 항이 계산을 버릴 것이라고 생각하지 않습니다. 기울기 및 절편의 추정치 (미분 값을 취하면 사라짐)에는 영향을 미치지 않으며 잔류 SSQ / 표준 편차의 추정치에만 영향을 미칩니다.
벤 볼커
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.