ソマーズのD[R]

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") # 二分位の連続と変数名を変更