
基準カテゴリー(参照カテゴリー)
名義変数(カテゴリカル変数)を factor() 関数を使用して因子型変数(factor variable)に変換することで、そのデータの値(カテゴリー)は「水準」(levels)として定義されます。数字であれば若い数、アルファベットはAに近い文字が基準カテゴリー(参照カテゴリー)となります。基準カテゴリーは、統計モデルでの比較の基点として機能します。水準は、levels関数で確認できます。
ロジスティック回帰を行うときには、オッズとオッズ比の基準カテゴリーが非常に重要になります。特に日本語記述の場合には、解析を行う前に基準を設定することをお勧めします。
データセットcross-1をdataに格納します(ファイルの読み込み)
xtabs()関数で分割表を作成
data <- read.csv("cross-1.csv", header=T, fileEncoding = "UTF-8")
tab <- xtabs(~ treatment + effect, data = data)
print(tab)

名義変数(カテゴリカル変数)を factor() 関数を使用して因子型変数に変換。このことで変数に水準(level)が付与されます。何も設定しない場合には、先頭の「no」が基準カテゴリーとして決定されます。
data$treatment <- as.factor(data$treatment)
data$effect <- as.factor(data$effect)
levels(data$treatment)
levels(data$effect)

effectを目的変数、treatmentを説明変数としたロジスティック回帰を実行してみましょう。treatment、effectを0, 1の二値変数に変換して(yes=1)、それぞれtreatment_n、effect_nとします。
data$treatment_n <- as.factor(ifelse(data$treatment == "yes", 1 , 0))
data$effect_n <- as.factor(ifelse(data$effect == "yes", 1 , 0))
levels(data$treatment_n)
levels(data$effect_n)
0が基準カテゴリーになっています。

ロジスティック回帰
effectを目的変数、treatmentを説明変数としたロジスティック回帰の実行。
fit <- glm(formula = effect_n ~ treatment_n, family=binomial, data=data)
summary(fit)

オッズ比

exp(1.7918)
treatmentの効果は有意なので、treatment=1, つまり「treatmentあり」は「treatmentなし」よりも、$e^{1.7918}$=約6倍のオッズであると言えます。この場合、オッズは、effectの基準カテゴリーが0なので、「effectあり」になる割合ということになります。分割表から求めたオッズは、$\dfrac{(12/3)}{(6/9)}=6$となっています。
目的変数が3値の場合の基準カテゴリー
データセットcross-2をdata2に格納します(ファイルの読み込み)
data2 <- read.csv("cross-2.csv", header=T, fileEncoding = "Shift-JIS")
tab2 <- xtabs(~ treatment + effect, data = data2)
print(tab2)

レベルの確認
data2$treatment <- as.factor(data2$treatment)
data2$effect <- as.factor(data2$effect)
levels(data2$treatment)
levels(data2$effect)
treatmentの基準カテゴリーは「20min/wk」、effectの基準カテゴリーは「no」となっています。

ここでは、このまま解析を進めてみます。0, 1, 2などに置き換えても、因子型変数であれば結果は同じです。ただし、数値として認識した場合には結果が異なるので注意してください。
fit2 <- glm(effect ~ treatment, family = binomial, data=data2)
summary(fit2)

目的変数のeffectの基準カテゴリーは「no」なので、「no」に対するyesの割合がオッズとなります。Interceptの係数=-1.6094が有意なので、「20min/wk」では、「no」に対するyesの確率が、$e^-1.6094=約0.2倍$となり、効果がないことが推定されます。一方、40min/wkおよび60min/wkは、「20min/wk」と比較してオッズが何倍になったのかが推定できます。例えば、60min/wkの係数は$e^3.6889=約40$なので、「20min/wk」に比べるとオッズが40倍になることが推定されます。
結論
20min/wkでは「yes」になる確率が低く、効果が少ないことが示されていますが、治療時間が長くなるにつれて「yes」のオッズが顕著に増加することが示されています。特に60min/wkの効果は非常に顕著で、治療効果が最も強いことが示唆されています。この結果は、より長い治療時間が効果的である可能性を支持しています。
<参考>
コメント欄 『間違い』や『分かりにくい部分』などのご意見もお寄せください