中央値を返す関数
前回はタイが存在しない場合を考えずに作成しましたが,今回はタイが存在しても計算してくれるような関数を定義してみましょう。
データの個数が偶数,奇数に関わらず中央に位置するデータと同順位が存在する場合は次式によって求められます。
n:全観測数
M:中央に位置する観測値
n(M):Mとなる観測値の数
n(x<M):Mよりも値が小さい観測値の数
チェック!! grep関数
grep関数は文字列を処理するための関数です。下のAを検索条件としてBの配列を検索します。
grep(/A/,B)
例えば
@dat=(1,2,3,4,5);
grep(/3/,@dat);
とした場合,3が検索条件になるわけですから,@datの配列の中から3を見つけ出します。
-関数の定義
package median;
sub median{
my @list=sort{$a<=>$b}@_; #昇順にソート
local $n=@_; #データの個数
if($n%2==0){ #データの個数が偶数のとき
my $x1=$n/2;
my $x2=$n/2+1;
$median=($list[$x1-1]+$list[$x2-1])*0.5;
@dat=grep(/$median/,@list);
local $tai=@dat;
if($tai==0){ #タイがない場合
return($median);
}else{ #タイがある場合
&tai_median; #sub tai_medianの呼び出し
}
}else{ #データの個数が奇数のとき
my $x=$n/2;
$median=$list[$x];
@dat=grep(/$median/,@list);
local $tai=@dat;
if($tai==0){ #タイがない場合
return($median);
}else{ #タイがある場合
&tai_median; #sub tai_medianの呼び出し
}
}
}
#タイがある場合の中央値を計算するルーチン
sub tai_median{
print "n:全観測数 \nM:中央に位置する観測値 \nnM:Mとなる観測値の数 \nnxM:Mよりも値が小さい観測値の数\n";
print "n= $n \n";
my $M=$median; print "M= $M \n";
my $nM=$tai; print "nM= $nM \n";
for($i=0;$i<$n;$i++){
if($M>$_[$i]){
$list[$i]=$_[$i];
}else{}
}
my $nxM=@list; print "nxM= $nxM \n";
$tai_median=($M-0.5)+($n/2-$nxM)/$nM;
return($tai_median);
}
1;
-関数の呼び出し
@dat=(1,2,3,4,5,6,7,8,9,10);
require("C://Perl/function/median.pl");
$x=median::median(@dat);
print $x;