したがって、データは次のように構成されています。
我々は持っています 参加者は、各参加者を3つのグループ(G )、そして参加者ごとに 連続変数のサンプル。また、0または1の値を予測しようとしています。
これらの値を予測する際に、MATLABを使用して連続変数とカテゴリ変数間の相互作用をテストするにはどうすればよいでしょうか。
したがって、データは次のように構成されています。
我々は持っています 参加者は、各参加者を3つのグループ(G )、そして参加者ごとに 連続変数のサンプル。また、0または1の値を予測しようとしています。
これらの値を予測する際に、MATLABを使用して連続変数とカテゴリ変数間の相互作用をテストするにはどうすればよいでしょうか。
回答:
最も簡単な方法であるIMOはglmfit
、生の(観測された)値の行列または設計行列のいずれかを受け入れるため、設計行列を自分で作成することです。完全なモデルを作成すれば、相互作用項のコーディングはそれほど難しくありません。2つの予測子があるとします。 (連続)および (カテゴリー、3つの順序付けられていないレベル、 )。ウィルキンソンの表記法を使用してy ~ x + g + x:g
、このモデルをとして記述し、左側は無視します(二項結果の場合は、ロジットリンク関数を使用します)。g
レベルをコード化するために必要なダミーベクトルは2つだけ(特定の観測に対して存在/不在として)なので、5つの回帰係数と切片項があります。これは次のように要約できます。
どこ のレベルをコード化する指標行列を表します 。
Matlabでは、オンラインの例を使用して、次のようにします。
x = [2100 2300 2500 2700 2900 3100 3300 3500 3700 3900 4100 4300]';
g = [1 1 1 1 2 2 2 2 3 3 3 3]';
gcat = dummyvar(g);
gcat = gcat(:,2:3); % remove the first column
X = [x gcat x.*gcat(:,1) x.*gcat(:,2)];
n = [48 42 31 34 31 21 23 23 21 16 17 21]';
y = [1 2 0 3 8 8 14 17 19 15 17 21]';
[b, dev, stats] = glmfit(X, [y n], 'binomial', 'link', 'probit');
デフォルトで含まれているため、切片の列は含めませんでした。設計マトリックスは次のようになります
2100 0 0 0 0
2300 0 0 0 0
2500 0 0 0 0
2700 0 0 0 0
2900 1 0 2900 0
3100 1 0 3100 0
3300 1 0 3300 0
3500 1 0 3500 0
3700 0 1 0 3700
3900 0 1 0 3900
4100 0 1 0 4100
4300 0 1 0 4300
相互作用項はx
、対応する列g
(g = 2およびg = 3、最初のレベルは必要ないため)の積としてコード化されていることがわかります。
結果は、係数、標準誤差、統計量、および(stats
構造体からの)p値として以下に示します。
int. -3.8929 2.0251 -1.9223 0.0546
x 0.0009 0.0008 1.0663 0.2863
g2 -3.2125 2.7622 -1.1630 0.2448
g3 -5.7745 7.5542 -0.7644 0.4446
x:g2 0.0013 0.0010 1.3122 0.1894
x:g3 0.0021 0.0021 0.9882 0.3230
これで、相互作用のテストは、上の完全なモデルと縮小モデル(設計項の最後の2列である相互作用の項を省略)からの逸脱度の差を計算することで実行できます。これは手動で、またはlratiotest
尤度比仮説検定を提供する関数を使用して行うことができます。完全なモデルの逸脱度は4.3122(dev
)ですが、相互作用のないモデルの逸脱度は6.4200(私が使用しましたglmfit(X(:,1:3), [y n], 'binomial', 'link', 'probit');
)であり、関連するLRテストには2つの自由度(2つのモデル間のパラメーター数の違い)があります。スケーリングされた逸脱度はGLMの対数尤度の2倍に過ぎないので、
[H, pValue, Ratio, CriticalValue] = lratiotest(4.3122/2, 6.4200/2, 2)
ここで、統計は 2 df(臨界値は5.9915、を参照chi2inv(0.95, 2)
)。出力は重要ではない結果を示しています。観測されたサンプル間x
との間に相互作用が存在すると結論付けることはできませんg
。
上記の手順を、お好みの便利な関数にまとめることができると思います。(LRテストはごく少数のコマンドで手動で行われる可能性があることに注意してください!)
これらの結果を、次に示すR出力と照合しました。
Rコードは次のとおりです。
x <- c(2100,2300,2500,2700,2900,3100,3300,3500,3700,3900,4100,4300)
g <- gl(3, 4)
n <- c(48,42,31,34,31,21,23,23,21,16,17,21)
y <- c(1,2,0,3,8,8,14,17,19,15,17,21)
f <- cbind(y, n-y) ~ x*g
model.matrix(f) # will be model.frame() for glm()
m1 <- glm(f, family=binomial("probit"))
summary(m1)
以下は、完全なモデルの係数の結果です。
Call:
glm(formula = f, family = binomial("probit"))
Deviance Residuals:
Min 1Q Median 3Q Max
-1.7124 -0.1192 0.1494 0.3036 0.5585
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.892859 2.025096 -1.922 0.0546 .
x 0.000884 0.000829 1.066 0.2863
g2 -3.212494 2.762155 -1.163 0.2448
g3 -5.774400 7.553615 -0.764 0.4446
x:g2 0.001335 0.001017 1.312 0.1894
x:g3 0.002061 0.002086 0.988 0.3230
2つのネストされたモデルを比較するために、次のコマンドを使用しました。
m0 <- update(m1, . ~ . -x:g)
anova(m1,m0)
次の「偏差テーブル」が生成されます。
Analysis of Deviance Table
Model 1: cbind(y, n - y) ~ x + g
Model 2: cbind(y, n - y) ~ x * g
Resid. Df Resid. Dev Df Deviance
1 8 6.4200
2 6 4.3122 2 2.1078