Rで作る分割表(クロス表)

1ページ 2ページ

分割表の基礎

分割表を作成します。
results = 検査結果(positive = 陽性、negative=陰性)
affected = 罹患(0=無し、1=あり)

R
results <- c(rep("negative",70), rep("positive",75))  

affected <- c(
  rep("no", 45),
  rep("yes", 25), 
  rep("yes", 8), 
  rep("no", 67)
)  

tab <- xtabs(~ results + affected)
print(tab)
> print(tab)
          affected
results    no yes
  negative 45  25
  positive 67   8
レベルの確認、基準の変更
基準カテゴリー

factor() 関数は名義変数をカテゴリカル変数(因子型変数)に変換し、データのカテゴリーは「水準」として定義されます。levels() 関数で表示されるカテゴリカル変数の水準のうち、最初に表示されるカテゴリーがデフォルトで基準カテゴリー(参照カテゴリー)となり、統計モデルでの比較の基点として機能します。relevel() 関数や factor() 関数の levels 引数を使用することで、レベルの順序を指定し、基準カテゴリーを変更することが可能です。

R
results <- factor(results)
affected <- factor(affected)
levels(results)
levels(affected)

> results <- factor(results)
> affected <- factor(affected)
> levels(results)
[1] "negative" "positive"
> levels(affected)
[1] "no"  "yes"

先頭に記載されている方がデータの基準カテゴリーとなります。検査結果の基準は”negative”、罹患の基準は”no”になっています。基準カテゴリーを変更して、左上が検査結果「陽性」、罹患「あり」に配置されるように変更します。

R
results <- relevel(results, "positive")
affected <- relevel(affected , "yes")
levels(results)
levels(affected)
> levels(results)
[1] "positive" "negative"
> levels(affected)
[1] "yes" "no" 
R
tab2 <- xtabs(~ results + affected)
print(tab2)
> print(tab2)
          affected
results    yes no
  positive   8 67
  negative  25 45

これで馴染みのある並び方になりました

感度=$\dfrac{8}{8+25}=\frac{TP}{TP+FN}$

特異度=$\dfrac{45}{67+45}=\frac{TN}{FP+TN}$


参考(ChatGPTの回答)

分割表を作成

筋力トレーニング:musc(実施=yes、非実施=no)
歩行練習:gait(実施=yes、非実施=no)
効果:effect (あり=good、なし=not)

R
dat <- data.frame(
    c(rep("yes", 15),rep("no", 15)),
    c(rep("yes", 9), rep("no", 6), rep("yes", 5), rep("no", 10)),
    c(rep("good", 12), rep("not", 3), rep("good", 4), "not", "good", "good", rep("not", 8))
)
colnames(dat) <- c("musc", "gait", "effect")
head(dat)
> head(dat)
  musc gait effect
1  yes  yes   good
2  yes  yes   good
3  yes  yes   good
4  yes  yes   good
5  yes  yes   good
6  yes  yes   good

1列目(筋トレ)と3列目(歩行練習)の分割表を作成

R
tab1 <- xtabs(
    ~musc + effect,
    data=dat
)
print(tab1)
> print(tab1)
     effect
musc  good not
  no     6   9
  yes   12   3

分割表を作業フォルダに保存する場合

R
write.csv(tab1, file="tab1.csv",fileEncoding="UTF-8")

エクセルなどで開いて文字化けすることが気になるのであれば、以下のように保存

R
write.csv(tab1, file="tab1.csv",fileEncoding="Shift-JIS")

ただし、次回読み込むときも fileEncoding=”Shift-JIS” とする

分割表の操作

周辺合計

R
addmargins(tab1)
> addmargins(tab1)
     effect
musc  good not Sum
  no     6   9  15
  yes   12   3  15
  Sum   18  12  30

基準カテゴリーを変更せずに、行の入れ替えも可能です。

R
tab1[c("yes","no"), ]
> tab1[c("yes","no"), ]
     effect
musc  good not
  yes   12   3
  no     6   9

転置

R
t(tab1)
> t(tab1)
      musc
effect no yes
  good  6  12
  not   9   3

コメント欄 『間違い』や『分かりにくい部分』などのご意見もお寄せください

タイトルとURLをコピーしました