「複数の学習データから行う回帰分析」なんだけど...
コメントの押し売りをするつもりはないんだけど,コメントの受付方法法くらい用意しておく方がよいのではないかと思います。
筆者は,update という関数名からなのか,「update するたびに素晴らしい結果が約束される」というような幻想を持っているのかな?
update は,以前に行った解析の主として formula を受け継いで,再度分析するということでは?再度の分析が必要なのは,データがアップデートされた(間違いが修正された,観察が増えた)ときに,最新のデータで分析結果をアップデートするということではないか?
例えば,以下のような例。
その時点で得られているデータに基づいて,回帰分析を行う。
> (d <- data.frame(x=c(2,1,3,4,5), y=c(3,5,4,7,9)))
x y
1 2 3
2 1 5
3 3 4
4 4 7
5 5 9
> lm1 <- lm(y ~ x, data=d)
> summary(lm1)
Call:
lm(formula = y ~ x, data = d)
Residuals:
1 2 3 4 5
-1.4 1.8 -1.6 0.2 1.0
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.0000 1.7963 1.113 0.347
x 1.2000 0.5416 2.216 0.114
Residual standard error: 1.713 on 3 degrees of freedom
Multiple R-squared: 0.6207, Adjusted R-squared: 0.4943
F-statistic: 4.909 on 1 and 3 DF, p-value: 0.1135
新たにデータが加わった。(同じ名前でもよいが,データフレームの名前を付け替えた)
> (d2 <- rbind(d, c(6, 12)))
x y
1 2 3
2 1 5
3 3 4
4 4 7
5 5 9
6 6 12
新たなデータを使って,formula はそのまま(lm1 に記録されているので,そこから取り出して使う)
> summary(update(lm1, data=d2))
Call:
lm(formula = y ~ x, data = d2)
Residuals:
1 2 3 4 5 6
-1.26667 2.33333 -1.86667 -0.46667 -0.06667 1.33333
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.0667 1.6479 0.647 0.5527
x 1.6000 0.4231 3.781 0.0194
Residual standard error: 1.77 on 4 degrees of freedom
Multiple R-squared: 0.7814, Adjusted R-squared: 0.7267
F-statistic: 14.3 on 1 and 4 DF, p-value: 0.01941
しかし,その結果は,最新のデータフレームを使って,lm1 を得たときと同じ formula を使って lm 関数により解を求めたものと,全く同じなのだ。
> summary(lm(y ~ x, data=d2))
Call:
lm(formula = y ~ x, data = d2)
Residuals:
1 2 3 4 5 6
-1.26667 2.33333 -1.86667 -0.46667 -0.06667 1.33333
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.0667 1.6479 0.647 0.5527
x 1.6000 0.4231 3.781 0.0194
Residual standard error: 1.77 on 4 degrees of freedom
Multiple R-squared: 0.7814, Adjusted R-squared: 0.7267
F-statistic: 14.3 on 1 and 4 DF, p-value: 0.01941
formula が長ったらしくたって,それを記録しておいて再度使えば良いだけだし。
lm オブジェクトとして保管しておき,その中の formula を使うなどということは,あまりメリットはないように思うが????
それと、コメント受付方法の指摘もありがとうございました。hatenaブログってデフォルトではコメントが受付できないようになっていたのに気がついていなかったです。修正しておきました。
まったくもって、ご指摘の通りです。
updateするのと、rbindで新しいinputを作ってからlmオブジェクトを構築するのと、何ら結果に違いはないです。
前提を書いていなかったので、誤解を招くような内容になっており、申し訳ないです。
いままで私も、新しいデータが手に入る度、rbindで学習データを作りなおしてから、lmオブジェクトを作成していました。
しかし、コードを見た時、updateを使ったほうが綺麗に見える(主観ですが)ため、「おお、これはすごい!」と思って記事にした次第です。
Rに関してはずぶの素人ですので、今後ともコメントいただければ幸いです。