Perlで回帰分析
先週金曜日、#clubdb2の勉強会に行ってパイソンは行列計算に強いというお話 だった。Perlでも行列計算はできるはず、advent calenderで見たことあるし。 さて、大学1年の時に習った?最小2乗法みたいなことができるかなと調べてみた。 statistics-and-data-mining-with-perl-data-language
pdlで回帰分析
pdl> $y=pdl(3,5,7,9); pdl> $x= pdl(1,2,3,4); pdl> %m= $y->ols($x); No PDL::Graphics::PGPLOT, no plot :( at (eval 132) line 4. pdl> print "$_\t$m{$_}\n" for (sort keys %m) F 1.93165805749064e+30 F_df [1 2] R2 [1] b [2 1] b_se [1.4390135e-15 3.9409008e-15] b_t [1.389841e+15 2.5374909e+14] ss_model [20] ss_residual [2.0707599e-29] ss_total [20] y_pred [3 5 7 9]
bが傾きが2で切片が1という意味かな
pdl> $y=pdl(4,6,8,10); pdl> %m= $y->ols($x); No PDL::Graphics::PGPLOT, no plot :( at (eval 135) line 4. pdl> print "$_\t$m{$_}\n" for (sort keys %m) F 1.01412048018258e+31 F_df [1 2] R2 [1] b [2 2] b_se [6.2803698e-16 1.7199501e-15] b_t [3.1845258e+15 1.1628244e+15] ss_model [20] ss_residual [3.9443045e-30] ss_total [20] y_pred [4 6 8 10]
こちらに プログラムで使う時のソースがあった。
bが傾きが2切片が2という意味かな。それ以外の意味が??であるけど、 統計学を学ぶと面白さがでてくるんだろうなぁ。
多重回帰分析
多重回帰分析というのも、あるということで・・・
y=a1x1+a2x2+b
use PDL::LiteF; use PDL::NiceSlice; use PDL::Stats::GLM; # do a multiple linear regression and plot the residuals my $y = pdl( 10, 12, 11, 10, 9, 8, 7, 6 ,7 ,14); my $x = pdl( [0, 0, 1, 2, 3, 4, 5, 6 ,7, 8] , # linear component [5, 6, 5, 4, 3, 2, 1, 0 ,0, 3] ); # linear component my %m = $y->ols( $x ); print "$_\t$m{$_}\n" for (sort keys %m);
なるほど。Rが1に近いほどいいのか。。 とりあえず、なんとなくわかってきた。
OLS:Ordinary Least Squares regression
線形回帰以外にも、分析手法があるようで・・奥が深い