私はいくつかのデータのスピアマンのランクを計算する必要があるプロジェクトに取り組んでいます。現在、私のプログラムは、同順位でない限り、スピアマンのランクを計算できます。既存のユニットを使用しますが、Spearmans の値自体だけでなく、ランク付けされた値をランクと共に文字列グリッドに表示する必要があります。同点の値のランクを平均して、同点のデータがある場合にテストを計算できるようにするソリューションを思いつくのに苦労しています。お時間をいただきありがとうございます。
スピアマンのランクはこちら
これは私がこれまでに持っているコードです。これは値を並べ替えてランク付けするだけで、実際のスピアマンの値は別の手順で計算されます
type Tspearman = record
x : string;
y : string;
xrank : string;
yrank : string;
d : string;
d2 : string;
end;
procedure TForm1.SortRank();
var
s:string;
P2, P2plus1,q : single;
Position_1, Position_2,i: Integer;
Temporary : TSpearman;
t:string;
begin
for Position_1 := 1 to ListBoxSP.Items.Count-1 do //Length(data) - 1 do
begin
for Position_2 := 1 to ListBoxSP.Items.Count-2 do //( Length( data ) - 2 ) do
begin
P2 := StrToFloat(data[ Position_2 ].x);
P2plus1 := StrToFloat(data[ Position_2 + 1 ].x );
if P2 > P2plus1 then // ascending
then
begin
Temporary := data[ Position_2 ];
data[ Position_2 ] := data[ Position_2 + 1 ];
data[ Position_2 + 1 ] := Temporary;
end;
end;
end;
For i :=1 to ListBoxSP.Items.Count
do
begin
data[i].xrank := IntToStr(i);
end;
for Position_1 := 1 to ListBoxSP.Items.Count-1 do //Length(data) - 1 do
begin
for Position_2 := 1 to ListBoxSP.Items.Count-2 do //( Length( data ) - 2 ) do
begin
P2 := StrToFloat(data[ Position_2 ].y);
P2plus1 := StrToFloat(data[ Position_2 + 1 ].y );
if P2 > P2plus1 then // ascending
begin
Temporary := data[ Position_2 ];
data[ Position_2 ] := data[ Position_2 + 1 ];
data[ Position_2 + 1 ] := Temporary;
end;
end;
end;
For i :=1 to ListBoxSP.Items.Count
do
begin
data[i].yrank := IntToStr(i);
end;
For i:=1 to ListBoxSP.Items.Count //This calculates the d values
do
begin
data[i].d := FloatToStr(StrToFloat(data[i].xrank)-StrToFloat(data[i].yrank));
end;
For i:=1 to ListBoxSP.Items.Count
do
begin
data[i].d2 := data[i].d;
q:= sqr(StrToFloat(data[i].d2));
data[i].d2 := FloatToStr(q);
end;
end;