多項式モデルをRのデータに適合させる


83

私はこの質問への回答を読みました、そしてそれらは非常に役に立ちます、しかし私は特にRで助けが必要です。

次のようにRにサンプルデータセットがあります。

x <- c(32,64,96,118,126,144,152.5,158)  
y <- c(99.5,104.8,108.5,100,86,64,35.3,15)

モデルをこれらのデータに適合させたいので、y = f(x)。3次多項式モデルにしたいと思います。

どうすればRでそれを行うことができますか?

さらに、Rは最適なモデルを見つけるのに役立ちますか?

回答:


98

x(x ^ 3)の3次多項式を取得するには、次のようにします。

lm(y ~ x + I(x^2) + I(x^3))

または

lm(y ~ poly(x, 3, raw=TRUE))

10次​​の多項式を近似して、ほぼ完全に近似することもできますが、そうする必要がありますか?

編集:poly(x、3)はおそらくより良い選択です(以下の@hadleyを参照)。


6
「すべきか」を尋ねるのにぴったりです。サンプルデータには8ポイントしかありません。ここでは自由度がかなり低くなっています。もちろん、実際のデータにはもっと多くのものがあるかもしれません。
JDロング

1
ご回答有難うございます。Rに最適なモデルを見つけてもらうのはどうですか?このための機能はありますか?
Mehper C. Palavuzlar 2010

5
それはあなたの「最良のモデル」の定義に依存します。最大のR ^ 2(10次多項式が与える)を与えるモデルは、必ずしも「最良の」モデルではありません。モデル内の用語は、合理的に選択する必要があります。多くのパラメーターを使用してほぼ完全にフィットさせることができますが、モデルには予測力がなく、ポイントを通る最適な線を描画する以外には役に立ちません。
グレッグ

10
なぜ使っているのraw = T?無相関変数を使用することをお勧めします。
ハドリー2010

2
と同じ結果を得るためにそれを行いましたlm(y ~ x + I(x^2) + I(x^3))。おそらく最適ではなく、同じ目的に2つの手段を与えるだけです。
グレッグ

45

どのモデルが「最適なモデル」であるかは、「最適」の意味によって異なります。Rには役立つツールがありますが、それらの中から選択するための「最良」の定義を提供する必要があります。次のサンプルデータとコードについて考えてみます。

x <- 1:10
y <- x + c(-0.5,0.5)

plot(x,y, xlim=c(0,11), ylim=c(-1,12))

fit1 <- lm( y~offset(x) -1 )
fit2 <- lm( y~x )
fit3 <- lm( y~poly(x,3) )
fit4 <- lm( y~poly(x,9) )
library(splines)
fit5 <- lm( y~ns(x, 3) )
fit6 <- lm( y~ns(x, 9) )

fit7 <- lm( y ~ x + cos(x*pi) )

xx <- seq(0,11, length.out=250)
lines(xx, predict(fit1, data.frame(x=xx)), col='blue')
lines(xx, predict(fit2, data.frame(x=xx)), col='green')
lines(xx, predict(fit3, data.frame(x=xx)), col='red')
lines(xx, predict(fit4, data.frame(x=xx)), col='purple')
lines(xx, predict(fit5, data.frame(x=xx)), col='orange')
lines(xx, predict(fit6, data.frame(x=xx)), col='grey')
lines(xx, predict(fit7, data.frame(x=xx)), col='black')

それらのモデルのどれが最高ですか?それらのいずれに対しても引数をとることができます(ただし、私は紫色のものを補間に使用したくないでしょう)。


15

「Rは最適なモデルを見つけるのに役立ちますか」という質問に関しては、テストするモデルのセットを指定できると仮定すると、おそらくこれを行う関数がありますが、これはn-1のセットの最初のアプローチとして適しています。次数多項式:

polyfit <- function(i) x <- AIC(lm(y~poly(x,i)))
as.integer(optimize(polyfit,interval = c(1,length(x)-1))$minimum)

ノート

  • このアプローチの有効性は、目的、前提条件、optimize()およびAIC()AICが使用する基準であるかどうかによって異なります。

  • polyfit()最小値が1つではない場合があります。次のようなものでこれを確認してください:

    for (i in 2:length(x)-1) print(polyfit(i))
    
  • as.integer()非整数多項式をどのように解釈するかが明確でないため、この関数を使用しました。

  • 数式の任意のセットをテストするには、「Eureqa」を検討してください。レビューしプログラムをここで検討してください。

更新

stepAICモデルの選択を自動化する関数(MASSパッケージ内)も参照してください。


EurequaをRとインターフェースするにはどうすればよいですか?
adam.888 2013

@ adam.888すばらしい質問-答えはわかりませんが、個別に投稿できます。その最後のポイントは少し余談でした。
デビッド・ルバウアー2013

注:AICは赤池情報量基準であり、さまざまな意味で最適であることが示されている方法で、近似に報酬を与え、モデルの多数のパラメーターにペナルティを課します。en.wikipedia.org/wiki/Akaike_information_criterion
Evgeni Sergeev 2014年

5

Rに最適なものを見つける最も簡単な方法は、モデルを次のようにコーディングすることです。

lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...)

ステップダウンAIC回帰を使用した後

lm.s <- step(lm.1)

5
I(x^2)などを使用しても、フィッティングに適切な直交多項式が得られません。
Brian Diggs 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.