💡

【R】【for文】ウィルコクソンの順位和検定をたくさんの項目で一気に計算する

2024/08/22に公開

環境

Windows11
R 4.3.3
Rstudio

はじめに

有意差を計算するとき10個くらいなら自分で一つずつ計算しようかと思えますが、それ以上だとめんどくさいし時間もかかるし絶対にやりたくないのでコードを書きました。
実は5年くらい前に作ったコードがあったのですが、パッケージのバージョンアップにより使えなくなっていたので書き直すついでにここに記録します。

ちなみに、ウィルコクソンの順位和検定は対応のない2群に対して行うノンパラメトリック検定です。ウィルコクソンの符号順位検定は対応のある2群に対して行うノンパラメトリック検定です。
詳細に関しては今回の目的にそぐわないので省略しますが、検索するとたくさんわかりやすい説明が出てきますので、そちらをご覧ください。

やりたいこと

・おなじみirisのデータを使ってspecies・[setosa]と[versicolor]のSepal.Length、Sepal.Width、Petal.Length、 Petal.Width に差があるのかを計算したい。
・ウィルコクソンの順位和検定を使う。

準備とデータの読み込み

irisをこのまま使用すると[setosa]と[versicolor]の他に[virginica]もあります。今回は2群比較したいので、[virginica]は邪魔。エクセルで該当行を削除したファイルを作ったり、R上で必要なところだけ抽出したりしましょう。別に全ての作業をRでやらなくてもいいんです。エクセルは便利。

[virginica]を削除したファイルをエクセル等で作った場合(タブ区切り保存の場合)

data <- read.table("iris_wo_virginica.txt",        # ファイル名
		    header = TRUE,    # 1行目は列名として扱う
		    sep = "\t")    # タブ区切り
		    
head(data)    # データの確認
tail(data)

R上で[virginica]を削除するなら以下

data <- read.table("iris.txt",        # ファイル名
		    header = TRUE,    # 1行目は列名として扱う
		    sep = "\t")    # タブ区切り

data <- subset(data, Species!="virginica")		    

head(data)    # データの確認
tail(data)

どちらでやってもこうなってればok。

元々はこう

for文を使って一気に計算していく

大枠はこのページを参考にしています。
https://beginner-r.com/use-forloop-for-statistical-analysis/

hoge1 <- data.frame()
hoge2 <- data.frame()

ncol(data) #列数の確認。

#確認した列数を↓では4になっているところに入れる。今回は最後の列が種類なので1引いて4にしている。
for(i in 1:4){  
result <- coin::wilcox_test(data[,i] ~ factor(Species), data = data,
                            alternative = "two.sided", distribution = "exact")

name <- names(data[i]) #カンマはいらない.列名読み込み.

p <- result@distribution@pvalue(result@statistic@teststatistic)

hoge1<-data.frame(name,p)#i番目のt検定の出力結果を代入
hoge2<-rbind(hoge2,hoge1)#hoge2の末行にhoge1を代入
}

head(hoge2)

write.table(hoge2, "test.txt",sep = "\t",   #タブ区切り
            quote = FALSE,   # ""を付けない
            row.names = TRUE, col.names = TRUE)

こうなってればok

inputの詳細はこちら↓
https://zenn.dev/ykyk_wet/articles/1762575db23fa2

Discussion