多項式モデルの近似から係数を解釈する方法は?


36

私が持っているいくつかのデータに適合する二次多項式を作成しようとしています。この適合をプロットするとしましょうggplot()

ggplot(data, aes(foo, bar)) + geom_point() + 
       geom_smooth(method="lm", formula=y~poly(x, 2))

私は得る:

散布図の信頼帯を持つ放物線近似のプロット

したがって、2次近似は非常にうまく機能します。Rで計算します。

summary(lm(data$bar ~ poly(data$foo, 2)))

そして私は得る:

lm(formula = data$bar ~ poly(data$foo, 2))
# ...
# Coefficients:
#                     Estimate Std. Error t value Pr(>|t|)    
# (Intercept)         3.268162   0.008282 394.623   <2e-16 ***
# poly(data$foo, 2)1 -0.122391   0.096225  -1.272    0.206
# poly(data$foo, 2)2  1.575391   0.096225  16.372   <2e-16 ***
# ....

今、私は私のフィットの式は次のように仮定します:

bar=3.2680.122foo+1.575foo2

しかし、それは間違った値を与えてくれます。たとえば、が3の場合、は3.15前後になると予想され。ただし、上記の式に挿入すると次のようになります。 foobar

bar=3.2680.1223+1.57532=17.077

何が得られますか?モデルの係数を誤って解釈していますか?


2
この質問はいくつかのスレッドで回答されています。これらのスレッドは、サイトで直交多項式を
whuber

6
@whuber問題が「直交多項式」にあることを知っていたなら、おそらく答えを見つけたでしょう。しかし、何を検索するのかわからない場合は、少し難しいです。
user13907 14年

2
また、コードで顕著に現れるpolyを検索することで回答を見つけることもできます。このような情報をコメントに入れる理由は2つあります。(1)リンクは、将来の読者だけでなく自分自身にも役立つ可能性があります。
whuber

7
最初にR polyを入力?polyしないでの使用に関する質問を投稿しましたか?これは、大きな友好的な文字の上部にある「直交多項式計算」を示しています。
グレン_b-モニカの復元14

4
@Glen_bええ、まあ、私入力し?polyて構文を理解しました。確かに、私はその背後にある概念についてほとんど知識がありません。他に何か(または「通常の」多項式と直交多項式の間に大きな違いがある)と、オンラインで見た例はすべてpoly()フィッティングに使用されているggplotことを知りませんでした。特にそれを使用しないのはなぜですか?結果が「間違っていた」と混同されることはありませんか?気を付けてください、私は数学に精通していません。私は他の人が見ていることを単に応用し、それを理解しようとしています。
user13907

回答:


55

私の詳細な答えは下にありますが、この種の質問に対する一般的な(つまり本物の)答えは次のとおりです。1)実験、ねじ回し、データを見て、何をしようともコンピュータを壊すことはできません。。。実験; または2)RTFM

以下にR、この質問で特定された問題を多かれ少なかれ再現するコードを示します。

# This program written in response to a Cross Validated question
# http://stats.stackexchange.com/questions/95939/
# 
# It is an exploration of why the result from lm(y_x+I(x^2))
# looks so different from the result from lm(y~poly(x,2))

library(ggplot2)


epsilon <- 0.25*rnorm(100)
x       <- seq(from=1, to=5, length.out=100)
y       <- 4 - 0.6*x + 0.1*x^2 + epsilon

# Minimum is at x=3, the expected y value there is
4 - 0.6*3 + 0.1*3^2

ggplot(data=NULL,aes(x, y)) + geom_point() + 
       geom_smooth(method = "lm", formula = y ~ poly(x, 2))

summary(lm(y~x+I(x^2)))       # Looks right
summary(lm(y ~ poly(x, 2)))   # Looks like garbage

# What happened?
# What do x and x^2 look like:
head(cbind(x,x^2))

#What does poly(x,2) look like:
head(poly(x,2))

最初lmは期待される答えを返します:

Call:
lm(formula = y ~ x + I(x^2))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53815 -0.13465 -0.01262  0.15369  0.61645 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.92734    0.15376  25.542  < 2e-16 ***
x           -0.53929    0.11221  -4.806 5.62e-06 ***
I(x^2)       0.09029    0.01843   4.900 3.84e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared:  0.1985,    Adjusted R-squared:  0.182 
F-statistic: 12.01 on 2 and 97 DF,  p-value: 2.181e-05

2番目lmは奇妙な何かを返します:

Call:
lm(formula = y ~ poly(x, 2))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53815 -0.13465 -0.01262  0.15369  0.61645 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.24489    0.02241 144.765  < 2e-16 ***
poly(x, 2)1  0.02853    0.22415   0.127    0.899    
poly(x, 2)2  1.09835    0.22415   4.900 3.84e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared:  0.1985,    Adjusted R-squared:  0.182 
F-statistic: 12.01 on 2 and 97 DF,  p-value: 2.181e-05

ためlmの二つの呼び出しに同じであり、それは、引数でなければならないlm異なっています。それでは、引数を見てみましょう。明らかにy、同じです。他の部分です。の最初の呼び出しで、右側の変数に関する最初のいくつかの観察結果を見てみましょうlm。の戻り値はhead(cbind(x,x^2))次のようになります。

            x         
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853

これは予想どおりです。最初の列はx2番目の列はx^2です。の2番目の呼び出しであるlmpolyの呼び出しはどうですか?の戻り値はhead(poly(x,2))次のようになります。

              1         2
[1,] -0.1714816 0.2169976
[2,] -0.1680173 0.2038462
[3,] -0.1645531 0.1909632
[4,] -0.1610888 0.1783486
[5,] -0.1576245 0.1660025
[6,] -0.1541602 0.1539247

OK、それは本当に違います。最初の列はそうxではなく、2番目の列はそうではありませんx^2。そのため、何poly(x,2)が返されてもx、およびは返されませんx^2。何polyが必要かを知りたい場合は、ヘルプファイルを読むことから始めます。だから私たちは言いhelp(poly)ます。説明は言う:

指定された点xのセットで次数1から次数の直交多項式を返すか評価します。これらはすべて次数0の定数多項式に直交します。あるいは、生の多項式を評価します。

これで、「直交多項式」が何であるかを知っているか、知らないかのどちらかです。そうでない場合は、ウィキペディアまたはBingを使用します(Googleはもちろん、Googleが悪であるため、Googleではありません。Appleほど悪くはありませんが、当然ですが、まだ悪いです)。または、直交多項式が何であるかを気にしないと決めるかもしれません。「生の多項式」というフレーズに気付くかもしれません。また、デフォルトではに等しいpolyオプションrawを持つヘルプファイルの少し下に気付くかもしれませんFALSE。これらの2つの考慮事項は、head(poly(x, 2, raw=TRUE))どのリターンを試すかを刺激します。

            1        2
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853

この発見に興奮して(今は正しいように見えますが、そうですか?)、試してみてくださいsummary(lm(y ~ poly(x, 2, raw=TRUE)))

Call:
lm(formula = y ~ poly(x, 2, raw = TRUE))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53815 -0.13465 -0.01262  0.15369  0.61645 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)              3.92734    0.15376  25.542  < 2e-16 ***
poly(x, 2, raw = TRUE)1 -0.53929    0.11221  -4.806 5.62e-06 ***
poly(x, 2, raw = TRUE)2  0.09029    0.01843   4.900 3.84e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared:  0.1985,    Adjusted R-squared:  0.182 
F-statistic: 12.01 on 2 and 97 DF,  p-value: 2.181e-05

上記の答えには少なくとも2つのレベルがあります。最初に、あなたの質問に答えました。第二に、さらに重要なことは、このような質問に自分で答える方法を説明したことです。「プログラミングの方法を知っている」すべての人が、600万回を超えるようなシーケンスを経験しています。私がいつもこのシーケンスを経験しているのと同じくらい、プログラミングが苦手な人でもです。コードが機能しないのは正常です。関数が何をするのかを誤解するのは普通です。それに対処する方法は、いじくり回し、実験し、データを見て、RTFMすることです。「ひたすらレシピに従う」モードから抜け出し、「探偵」モードにします。


7
これは+6に値すると思います。それが可能になったとき、私は数日後に覚えようとします。FTR、それほど皮肉なものである必要はないと思いますが、直交多項式が何であるか/それらがどのように機能するか、そしてそのようなことを理解するために使用するプロセスを示すのは良い仕事です。
GUNG -復活モニカ

13
すばらしい答え、ありがとう。私は "RTFM"に少し腹を立てていますが(おそらくそれは私だけかもしれません):問題は、少なくともRで線形回帰を行うことに関して、私が読んだすべてにおいて、人々は時々これを行い、他の人はそれを行います。率直に言って、直交多項式に関するウィキペディアのエントリを理解していません。あなたが得る係数が「間違っている」場合、なぜこれを回帰に使用するのかは私にはわかりません。私は数学者ではありません。私は料理の専門家ではないので、レシピに従うようにしていますが、それでも何かを食べる必要があります。
user13907 14年

12
@ user13907、それはあなただけではありません。これは確かに良い答えであり、投票する価値がありますが、より良い音色を持っていることは有益です。
ウォルディルレオンシオ

8
ここで直交多項式が何であるかを本当に理解する必要はありません---それらはあなたが望むものではないことを理解する必要があります。なぜ直交多項式が必要なのでしょうか?cov(poly(x、2))を送信して、多項式の2つの項間の共分散がゼロであることを確認します(丸め誤差まで)。これは直交多項式の重要な特性です---それらの項は互いにゼロの共分散を持っています。RHS変数が互いに相関関係を持たないことが便利な場合があります。それらの係数は間違っていません、実際、それらは異なって解釈される必要があります。
ビル

2
ああ、わかりました、平易な英語でのその説明は今理にかなっています。ありがとうございました。
user13907 14年

5

スティムソンらによる多項式回帰の解釈には興味深いアプローチがあります。(1978)。書き換えが含まれます

Y=β0+β1バツ+β2バツ2+あなたは

として

Y=m+β2fバツ2+あなたは

m=β0β12/4β2β2f=β1/2β2


2
+1関連する分析については、stats.stackexchange.com / questions / 28730およびstats.stackexchange.com/questions/157629を参照してください。
whuber

4

あまり判断せずに正しい方向にナッジしたいだけの場合:結果の多項式間の相関を完全に無視poly()するに対してI()、直交(相関ではない)多項式を作成します。予測変数間の相関は、線形モデルで問題になる可能性があるため(相関が問題になる理由について詳しくは、こちらを参照)、おそらく(一般的に)のpoly()代わりに使用することをお勧めしI()ます。さて、なぜ結果がそれほど違って見えるのでしょうか?さて、両方poly()I()x を取り、それを新しいxに変換します(の場合I()、新しいxはx ^ 1またはx ^ 2で、の場合poly()、新しいxははるかに複雑です(知りたい場合)彼らがどこから来たのか(そしておそらくあなたはそうではない)、あなたは始めることができますこちらまたは前述のウィキペディアのページまたは教科書)。重要なのは、特定のx値のセットに基づいてyを計算(予測)するときは、poly()またはI()(線形モデルにあったものに応じて)によって生成される変換されたx値を使用する必要があります。そう:

library(ggplot2)    

set.seed(3)
epsilon <- 0.25*rnorm(100)
x       <- seq(from=1, to=5, length.out=100)
y       <- 4 - 0.6*x + 0.1*x^2 + epsilon

# Minimum is at x=3, the expected y value there is
4 - 0.6*3 + 0.1*3^2

ggplot(data=NULL,aes(x, y)) + geom_point() + 
   geom_smooth(method = "lm", formula = y ~ poly(x, 2))

modI <- lm(y~x+I(x^2)) 
summary(modI) # Looks right
modp <- lm(y ~ poly(x, 2))
summary(modp)  # Looks like garbage

# predict y using modI
coef(modI)[1] + coef(modI)[2] * 3^1 + coef(modI)[3] * 3^2

# predict y using modp
# calculate the new x values using predict.poly()
x_poly <- stats:::predict.poly(object = poly(x,2), newdata = 3)
coef(modp)[1] + coef(modp)[2] * x_poly[1] + coef(modp)[3] * x_poly[2]

この場合、両方のモデルが同じ答えを返します。これは、予測変数間の相関が結果に影響を与えていないことを示唆しています。相関が問題である場合、2つの方法は異なる値を予測します。


1

'poly'は、多項式1、x、x ^ 2、...、x ^ degでGraham-Schmidtのオルソ正規化を実行します。たとえば、この関数は、もちろん 'coef'属性を返さずに 'poly'と同じことを行います。

MyPoly <- 
function(x, deg)
{
    n <- length(x)
    ans <- NULL
    for(k in 1:deg)
    {
        v <- x^k
        cmps <- rep(0, n)
        if(k>0) for(j in 0:(k-1)) cmps <- cmps + c(v%*%ans[,j+1])*ans[,j+1]
        p <- v - cmps
        p <- p/sum(p^2)^0.5
        ans <- cbind(ans, p)
    }
    ans[,-1]
}

関数型に興味があったので、このスレッドに行きました。では、「ポリ」の結果を表現としてどのように表現するのでしょうか?Graham-Schmidtの手順を逆にするだけです。あなたは混乱になってしまいます!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.