共分散を返す関数
今まで扱ってきた代表値はどれも1変量のデータに用いられるものでしたが,ここからは2変量のデータを扱う練習をしましょう。とはいっても,これまでやってきたことをしっかりと把握していれば大して難しいことをやるわけではないので大丈夫でしょう。
共分散は次式によって求められます。
さて,2変量のデータすなわち
@x=(1,2,3,4,5);
@y=(6,7,8,9,10);
といったような2つのベクトルを扱うにはどうすればよいでしょうか?その疑問に答えるには次のプログラムの意味を理解しておく必要があります。
@x=(1,2,3,4,5); @y=(6,7,8,9,10); &function(@x,@y); sub function{ my $n=@_; print "@xと@yのデータの総数は$nです。\n"; for($i=0;$i<$n;$i++){ print "ベクトルの$i個目の要素は$_[$i]です。\n"; } }
要するに関数の引数に指定した値はすべて@_というベクトルの中に格納されるわけです。つまり@_の中には@xと@yのデータが一緒に格納されているということになります。
-関数の定義 *今回のプログラムで工夫しなければいけないのはfor構文によるループの部分だけです。
package cov; sub cov{ require("C://Perl/function/mean.pl"); my $n=@_; my $h=$n/2; #これ以降の部分が重要 for($i=0;$i<$h;$i++){ $x[$i]=shift(@_); } for($k=0;$k<$h;$k++){ $y[$k]=shift(@_); } #ここまで my $x_bar=mean::mean(@x); #引数の@xには何が入っているでしょうか my $y_bar=mean::mean(@y); #引数の@yには何が入っているでしょうか $sum=0; for($s=0;$s<$h;$s++){ $sum+=($x[$s]-$x_bar)*($y[$s]-$y_bar); } $S_xy=$sum/($h-1); return($S_xy); } 1;
-関数の呼び出し
@x=(1,2,3,4,5); @y=(6,7,8,9,10); require("C://Perl/function/cov.pl"); $a=cov::cov(@x,@y); print $a;