なぜRのlm()は私の教科書とは異なる係数推定値を返すのですか?


13

バックグラウンド

モデルのフィッティングのコースの最初の例を理解しようとしています(これはばかげて単純に見えるかもしれません)。私は手作業で計算を行っており、例と一致していますが、Rでそれらを繰り返すと、モデル係数はオフになります。Rは標本分散()を使用しているのに対し、母分散()を使用している教科書に違いがあるのではないかと考えましたが、これらが計算でどこで使用されているかわかりません。たとえば、どこかで使用している場合 、メモに関するヘルプセクション:σ2S2lm()var()var()

分母n-1が使用され、iid観測の(共)分散の不偏推定量が得られます。

私は両方のコードを見てlm()おりlm.fit()、どちらも使用していませんが、そのデータをコンパイルされたCコード()に渡しますがvar()、アクセスできません。lm.fit()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すると、同じように見えるためです。
統計14年

2
mod.m = 8/3とmod.b = -1の係数は、私が理解している限りコメントのどこでも計算されないため、明らかではありません。上記の@Statがコメントしているように、mod.mの計算にエラーがあるようです。
ジュホコッカラ14年

2
誰でも間違いを犯す可能性があることに留意することが重要です-あなたの教師、あなた、ここの回答者、Rプログラマー-誰でも。そのため、物事が合わないときにどこに間違いがあるのか​​を考えようとするときは、他の何人が各物をチェックしているのかを考えてください。lmR の関数の場合、文字通り何万人もの人々が結果を他のものと比較することで結果をチェックlmし、コードの何かが変更されるたびに既知の例に対して出力がチェックされます。ここに答えがあれば、少なくとも数人がチェックする可能性があります(あなたの質問は29回見られています)。
-Glen_b-モニカを復元14

1
@Glen_bあなたのポイントは、実際に私がここに尋ねに来た理由です。このような基本的な計算でRがどのように間違っているのか理解できませんでしたが、なぜそれらが異なっていたのかわかりませんでした。私は、ソースコードをaround索しました。しかし、最終的に、エラーは最後に見ようと思った場所にありました。これは、主に微積分の部分が私の知識の限界にあるためです。私は答えから多くを学びました!
ポストホック14年

2
はい、なぜ異なるのかを理解することが重要です。ここで解決できないかどうか尋ねるのは理にかなっています。私があなたが考えた最後の場所が代わりに最初に見る場所の1つであったかもしれない理由を提案しようとしました。私は1つまたは2つの機会に、例に対して土壇場で「単純化」する変更を行うことに気づきました。
-Glen_b-モニカを復元14

回答:


25

著者がどこかで数学的エラーを犯したようです。

平方和の偏差を拡大する場合

S=b+m12+b+2m52+b+4m92
S=b2+2bm+m2+12b2m+b2+4bm+4m2+2510b20m+b2+8bm+16m2+8118b72m

3b2+14bm+21m2+10730b94m

Sbm

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

解決する

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

Rは、これは確かに2.571429だと言います...

このリンクに基づいて、これはCourseraコースからのもののようです...?どこかにデータの誤記があったのでしょうか?

yy¯バツバツ¯バツバツ¯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

{111/39}{159}


2
ワオ。はい、あなたは正しいです。それはCourseraコースからのものであり、転写からではなくビデオからです。そのため、ビデオの計算を簡単にするために彼がそれを単純化し、誰もそれを試して繰り返すことを期待していなかったと思います。それはたまたま私が見た最初のビデオだったので、私はそれをフォローしようとしました。数学に関してはスキルアップする必要があることは明らかです。しかし、エラーが見つかったと思います。あなたが言っている定数項は重要ではありませんが、おそらく彼の計算を介して正しい値です。私はあなたの答えをもう何回か見て、自分自身を教えます。ほんとうにありがとう!
ポストホック14年

定数項が計算から外れるとは思わない。勾配と切片の推定値には影響せず(導関数を取得すると消えます)、残留SSQ /標準偏差の推定値のみに影響します。
ベンボルカー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.