井出草平の研究ノート

全ての組み合わせでCramerのVを計算する[R]

今回はCramerのVの計算。
CramerのVは名目尺度以上のものに適応できる。
今回は2値の名義尺度と3値の順序尺度を例にしている。

検定はカイ二乗検定を用いるため、やや複雑でAIにすべて書かせるのは無理だった。
Phindが書いたのはCramerのVのところだけだが、今回のfor文は非常に洗練されている。カイ二乗検定の方もプロンプトに含まれていたが、ちゃんと書けなかったので、カイ二乗の方や合併するコードは自力で書いている。プロンプトが正確であっても、AIの出力にはまだ難がある感じだ。
まだ、ダミーデータを作成する。

set.seed(1234) # 乱数の再現性を確保するためにseedを設定
nominal_data <- data.frame(matrix(sample(0:1, 1000, replace=TRUE), ncol=10))
colnames(nominal_data) <- paste0("nom", 1:10)
ordered_data <- data.frame(matrix(sample(0:2, 1000, replace=TRUE), ncol=10))
colnames(ordered_data) <- paste0("ord", 1:10)

CramerのVはvcdパッケージで求められるが、今回は関数を作った。

cramer_v <- function(x, y) {
  confusion_matrix <- table(x, y)
  chi_square <- chisq.test(confusion_matrix)$statistic
  n <- sum(confusion_matrix)
  sqrt(chi_square / (n * (min(nrow(confusion_matrix), ncol(confusion_matrix)) - 1)))
}

for文からcsv書き出しまで。

cramer_results <- data.frame()
for (nom_col in colnames(nominal_data)) {
  for (ord_col in colnames(ordered_data)) {
    v <- cramer_v(nominal_data[[nom_col]], ordered_data[[ord_col]])
    cramer_results <- rbind(cramer_results, c(nom_col, ord_col, v))
  }
}

chi_results <- data.frame()  
for (nom_col in colnames(nominal_data)) {
  for (ord_col in colnames(ordered_data)) {
    chi <- chisq.test (nominal_data[[nom_col]], ordered_data[[ord_col]])  
    chi_results <- rbind(chi_results, c(chi$statistic, chi$parameter, chi$p.value))
  }
}

results <- cbind(cramer_results, chi_results)
colnames(results) <- c("orderd_var", "nominal_var", "Cramer's_V","chi-square", "df", "p-value")

write.csv(results, "results.csv")

確認

ちゃんと計算したかは、確認はvcdパッケージで確かめられる。

library(vcd)
tab <- table(ordered_data$ord1, nominal_data$nom1)
summary(assocstats(tab))

Phindへのコマンド

Rのコードを作成してください。
まず、ダミーデータを2つ作成します。1つ目はnominal_dataというデータフレームで、変数が10個、ケース数が100個で構成され、0と1のどちらかの数字がランダムに入っており、変数名はnomを頭に付けて1から10までの数字を合わせます。2つ目はordered_dataというデータフレームで、変数が10個、ケース数が100個で構成され、0から2までの数字がランダムに入っており、変数名はordを頭に付けて1から10までの数字を合わせます。
次に解析を行います。パッケージを使用せず、自分で関数を作成してください。nominal_dataとordered_dataから1つずつ変数を選びCramer'sを計算します。すべての組み合わせで行ってください。出力としてCramer's Vを示し、csvファイルとして書き出してください。