鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

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

線形回帰以外にも、分析手法があるようで・・奥が深い

今さら人に聞けない「重回帰分析の各手法の使い分け」