今回は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ファイルとして書き出してください。