サイトトップ | Software Tips | RについてのTips
最終更新:2014年5月14日
講義テキストの第8節「2つのカテゴリ変数の独立性」に記載した通り,2つのカテゴリ変数が独立でない場合,どのくらいの関連があるのかを示したいことがある。
この目的には,疫学研究でよく使われるオッズ比やリスク比の他,量的な変数でいえば相関係数に当たるものとして,2つのカテゴリ変数の水準が2つずつの場合はファイ係数やコンティンジェンシー係数(vcdパッケージのassocstats()関数にクロス集計表を与える),どちらかが3つ以上の場合はポリコリック相関係数(polycorパッケージのpolychor()関数に2つのカテゴリ変数を与える。標準誤差が欲しいときはstd.err=TRUEオプションを付ける)を使うのが普通である。実行例を以下に示す。
> library(MASS) # これは基本パッケージなので,R本体と同時にインストールされるはず。 > library(polycor) # 未インストールの際は一度だけinstall.packages("polycor", dep=TRUE) 要求されたパッケージ mvtnorm をロード中です 要求されたパッケージ sfsmisc をロード中です > library(vcd) # 未インストールの際は一度だけinstall.packages("vcd", dep=TRUE) 要求されたパッケージ grid をロード中です > str(survey) # MASSパッケージに入っているデータ 'data.frame': 237 obs. of 12 variables: $ Sex : Factor w/ 2 levels "Female","Male": 1 2 2 2 2 1 2 1 2 2 ... $ Wr.Hnd: num 18.5 19.5 18 18.8 20 18 17.7 17 20 18.5 ... $ NW.Hnd: num 18 20.5 13.3 18.9 20 17.7 17.7 17.3 19.5 18.5 ... $ W.Hnd : Factor w/ 2 levels "Left","Right": 2 1 2 2 2 2 2 2 2 2 ... $ Fold : Factor w/ 3 levels "L on R","Neither",..: 3 3 1 3 2 1 1 3 3 3 ... $ Pulse : int 92 104 87 NA 35 64 83 74 72 90 ... $ Clap : Factor w/ 3 levels "Left","Neither",..: 1 1 2 2 3 3 3 3 3 3 ... $ Exer : Factor w/ 3 levels "Freq","None",..: 3 2 2 2 3 3 1 1 3 3 ... $ Smoke : Factor w/ 4 levels "Heavy","Never",..: 2 4 3 2 2 2 2 2 2 2 ... $ Height: num 173 178 NA 160 165 ... $ M.I : Factor w/ 2 levels "Imperial","Metric": 2 1 NA 2 2 1 1 2 2 2 ... $ Age : num 18.2 17.6 16.9 20.3 23.7 ... > # 以下は,EZRでは「統計解析」「名義変数の解析」 > # 「分割表の作成と群間の比率の比較(Fisherの正確検定)」と選ぶ > xtabs(~Sex+W.Hnd, data=survey) W.Hnd Sex Left Right Female 7 110 Male 10 108 > fisher.test(xtabs(~Sex+W.Hnd, data=survey)) Fisher's Exact Test for Count Data data: xtabs(~Sex + W.Hnd, data = survey) p-value = 0.6158 alternative hypothesis: true odds ratio is not equal to 1 95 percent confidence interval: 0.2140244 2.0876656 sample estimates: odds ratio 0.6883665 > assocstats(xtabs(~Sex+W.Hnd, data=survey)) X^2 df P(> X^2) Likelihood Ratio 0.54629 1 0.45984 Pearson 0.54351 1 0.46098 Phi-Coefficient : 0.048 Contingency Coeff.: 0.048 Cramer's V : 0.048 > xtabs(~Smoke+Exer, data=survey) Exer Smoke Freq None Some Heavy 7 1 3 Never 87 18 84 Occas 12 3 4 Regul 9 1 7 > fisher.test(xtabs(~Smoke+Exer, data=survey)) Fisher's Exact Test for Count Data data: xtabs(~Smoke + Exer, data = survey) p-value = 0.4138 alternative hypothesis: two.sided > polychor(survey$Smoke, survey$Exer, std.err=TRUE) Polychoric Correlation, 2-step est. = -0.042 (0.1006) Test of bivariate normality: Chisquare = 5.628, df = 5, p = 0.3441 > # カテゴリ順序を付け直す。 > # EZRでは「アクティブデータセット」「変数の操作」「因子水準を再順序化する」 > survey$Smoke <- factor(survey$Smoke, levels=c("Never", "Occas", "Regul", "Heavy"), ordered=TRUE) > survey$Exer <- factor(survey$Exer, levels=c("None","Some","Freq"), ordered=TRUE) > xtabs(~Smoke+Exer, data=survey) Exer Smoke None Some Freq Never 18 84 87 Occas 3 4 12 Regul 1 7 9 Heavy 1 3 7 > polychor(survey$Smoke, survey$Exer, std.err=TRUE) Polychoric Correlation, 2-step est. = 0.1269 (0.1011) Test of bivariate normality: Chisquare = 4.274, df = 5, p = 0.5107 > fisher.test(xtabs(~Smoke+Exer, data=survey)) Fisher's Exact Test for Count Data data: xtabs(~Smoke + Exer, data = survey) p-value = 0.4138 alternative hypothesis: two.sided
正しい順序の順序変数にすると,ポリコリック相関係数は,順序を無視したときとは結果が変わるけれども,フィッシャーの正確検定の結果は変わらない。順序変数の間では,量的変数としての扱いを強制し,スピアマンの順位相関係数を求めることもできるが,同順位が多いためp値が正しく得られないという問題を生じるので,ポリコリック相関係数を使う方が良い。
> cor.test(as.numeric(survey$Smoke), as.numeric(survey$Exer), method="spearman") Spearman's rank correlation rho data: as.numeric(survey$Smoke) and as.numeric(survey$Exer) S = 1994287, p-value = 0.1699 alternative hypothesis: true rho is not equal to 0 sample estimates: rho 0.08964512