裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

update の価値が理解できないなあ

2014年05月08日 | ブログラミング

複数の学習データから行う回帰分析」なんだけど...

コメントの押し売りをするつもりはないんだけど,コメントの受付方法法くらい用意しておく方がよいのではないかと思います。

筆者は,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 を使うなどということは,あまりメリットはないように思うが????



コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

余計なことはしない

2014年05月08日 | ブログラミング

統計を始める方へ(1)_データ環境Rの基本的なプログラミング|データアーティスト」で,ついでに...

z <- c(1:n) のようなプログラム片が示されていたけど,c 関数は余計

> n <- 1e8
> system.time(z <- c(1:n))
   ユーザ   システム       経過  
     0.431      0.297      0.724
> system.time(z <- 1:n)
   ユーザ   システム       経過  
     0.112      0.152      0.261

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最適な関数を最適に使おう

2014年05月08日 | ブログラミング

統計を始める方へ(1)_データ環境Rの基本的なプログラミング|データアーティスト」で,サイコロをシミュレーションするプログラム片で,round(6*runif(n)+0.5) が使われていたので,重箱の隅つつき...

> n <- 1e8
> system.time(x <- round(6*runif(n)+0.5))
   ユーザ   システム       経過  
     7.789      0.625      8.362
> system.time(x <- sample(1:6, n, replace=TRUE))
   ユーザ   システム       経過  
     2.860      0.460      3.296
> system.time(x <- sample(6, n, replace=TRUE))
   ユーザ   システム       経過  
     1.780      0.153      1.923

意外とやりそうなのが,sample(1:6, n, replace=TRUE) であるが,これは,sample(6, n, replace=TRUE) より劣る。以下の例を見れば分かる。何故そうなるかは,sample のソースを見れば分かる。

> n <- 1e8
> m <- 1e5
> system.time(y <- sample(1:m, n, replace=TRUE))
   ユーザ   システム       経過  
     3.281      0.485      3.741
> system.time(y <- sample(m, n, replace=TRUE))
   ユーザ   システム       経過  
     1.781      0.162      1.932

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村