SatataでソマーズのDの出力の方法を以前のエントリで書いたのでRでの出し方も書いておこうと思う。
ryoureadyパッケージ
ryoureadyパッケージを使うのが最も楽なのではないかと思う。 ord.somers.d関数を利用する。データは「データ作成」以降のスクリプトにある。
library(ryouready) t1 <- table(d3$Science, d2$Math) # 表形式にする ord.somers.d(t1)
結果は以下。
Somers' d: Columns dependent: 0.518 Rows dependent: 0.345 Symmetric: 0.414
注意点としては、表形式にしてから投入しなけばいないところである。
- Columns dependent
行変数を独立変数、列変数を従属変数としたソマーズのD。 - Rows dependent
列変数を独立変数、行変数を従属変数としたソマーズのD。 - symmetric
対称ソマーズのD。
InformationValueパッケージ
InformationValueパッケージでもソマーズのDが出力できる。
但し、こちらのパッケージは2値データが0/1という値でないといけない、列変数を独立変数としたソマーズのDしか出力できないという限定的なの機能になっている。
d3b <- d3 # 新しいデータを作成 library(memisc) d3b$Science <- recode(d3b$Science, 0 <- 1, 1 <- 2) # リコード d3b$Math <- recode(d3b$Math, 0 <- 1, 1 <- 2) # リコード library(InformationValue) somersD(d3b$Science, d2$Math) # 2値データが前 [1] 0.3244561
データ作成
library(mvtnorm) set.seed(1234) # 乱数シードの固定 N <-1000 # サンプルサイズの指定 Sigma = matrix(c(1,0.54,0.54,1), byrow=TRUE, ncol=2) # c()の中に相関係数を入れる。 mu <- c(10, 10) # 平均値 d1 <- data.frame(rmvnorm(n=N, mean=mu, sigma=Sigma)) # 乱数の作成 d1 <- d1*5 d1 <- round(d1) # まるめ(四捨五入で整数値に) colnames(d1) <- c("Math","Science") # 列名を挿入 summary(d1)
4分位。順序変数に。
library(OneR) d2 <- bin(d1, nbins = 4, labels = c(1,2,3,4), method = "content") library(dplyr) d2 <- d2 %>% mutate_if(is.factor, as.ordered) colnames(d2) <- c("Math.4","Science.4") # 四分位と変数名を変更 d2_num <- d2 %>% mutate_if(is.factor, as.numeric) colnames(d2_num) <- c("Math.4n","Science.4n") # 四分位の連続と変数名を変更
2分位(中央値)。Factor型に。
d3 <- bin(d1, nbins = 2, labels = c(1,2), method = "content") colnames(d3) <- c("Math.2","Science.2") # 二分位と変数名を変更 d3_num <- d3 %>% mutate_if(is.factor, as.numeric) colnames(d3_num) <- c("Math.2n","Science.2n") # 二分位の連続と変数名を変更