単純なカイ二乗検定の代わりとしてglm()を使用する


15

glm()R を使用して帰無仮説を変更することに興味があります。

例えば:

x = rbinom(100, 1, .7)  
summary(glm(x ~ 1, family = "binomial"))

という仮説をテストします。nullを =何らかの任意の値に変更したい場合はどうすればよいですか? p=0.5pglm()

これはprop.test()and でも実行できることはわかっていますが、カテゴリデータに関連するすべての仮説をテストchisq.test()するために使用glm()するアイデアを探求したいと思います。


7
+1。 明らかに確率として表される二項パラメータを指します 自然リンク(およびデフォルトで使用されるリンク)はロジットであるため、混乱を避けるために、pをそのロジット logオッズlog p /1 p ))と区別することが重要です。pglmplog(p/(1p))
whuber

回答:


19

あなたが使用することができ、オフセットglmを有するfamily="binomial"対数オッズ又はロジットスケールに推定するパラメータ、 0または0.5の確率オッズをログに記録する対応します。pの確率と比較する場合は、ベースライン値をq = logitp = log p /1 p )にする必要があります。統計モデルはβ0=0pq=logit(p)=log(p/(1p))

YBinom(μ)μ=1/(1+exp(η))η=β0+q

最後の行のみが標準セットアップから変更されています。Rコードの場合:

  • offset(q)式で使用する
  • logit / log-odds関数は qlogis(p)
  • 少し面倒なことに、応答変数の各要素にオフセット値を指定する必要があります-Rは定数値を自動的に複製しません。これは、データフレームを設定することで以下で実行されますが、単に使用することもできますrep(q,100)
x = rbinom(100, 1, .7)
dd <- data.frame(x, q = qlogis(0.7)) 
summary(glm(x ~ 1 + offset(q), data=dd, family = "binomial"))

2
(+1)これにより、Waldテストが行​​われます。LRTは、nullモデルglm(y ~ offset(q)-1, family=binomial, data=dd)を適合させlrtestlmtestパッケージから使用して実行できます。ピアソンのカイ二乗検定は、GLMモデルのスコア検定です。Wald / LRT / Scoreはすべて一貫したテストであり、適度に大きいサンプルサイズで同等の推論を提供する必要があります。
AdamO

1
私はあなたにも使用することができると思うanova()LRテストを取得するためにGLMにベースRから
ベンBolker

興味深いことに、ANOVAを使用する習慣を失いました。ただし、anovaはテストのpvalueの出力を拒否しますが、そうではありlrtestません。
AdamO

2
多分anova(.,test="Chisq")
ベンボルカー

6

GLMのパラメーターの信頼区間を確認します。

> set.seed(1)
> x = rbinom(100, 1, .7)
> model<-glm(x ~ 1, family = "binomial")
> confint(model)
Waiting for profiling to be done...
    2.5 %    97.5 % 
0.3426412 1.1862042 

これは、対数オッズの信頼区間です。

以下のために我々はログO D D S = ログPp=0.5。したがって、p=0.5という仮説をテストすることは、信頼区間に0が含まれているかどうかをチェックすることと同等です。これはそうではないため、仮説は棄却されます。log(odds)=logp1p=log1=0p=0.5

これで、任意の、対数オッズを計算し、信頼区間内にあるかどうかを確認できます。p


1
p<0.05

2
confintp<0,05

2

仮説検定としてglm.summary関数のz / t値に基づいたp値を使用することは(完全に)正確ではありません。

  1. 紛らわしい言語です。報告された値はz値と呼ばれます。ただし、この場合、真の偏差の代わりに推定標準誤差を使用します。したがって、実際には、それらはt値に近くなります。次の3つの出力を比較します
    。1)summary.glm
    2)t検定
    3)z検定

    > set.seed(1)
    > x = rbinom(100, 1, .7)
    
    > coef1 <- summary(glm(x ~ 1, offset=rep(qlogis(0.7),length(x)), family = "binomial"))$coefficients
    > coef2 <- summary(glm(x ~ 1, family = "binomial"))$coefficients
    
    > coef1[4]  # output from summary.glm
    [1] 0.6626359
    > 2*pt(-abs((qlogis(0.7)-coef2[1])/coef2[2]),99,ncp=0) # manual t-test
    [1] 0.6635858
    > 2*pnorm(-abs((qlogis(0.7)-coef2[1])/coef2[2]),0,1) # manual z-test
    [1] 0.6626359
  2. それらは正確なp値ではありません。二項分布を使用したp値の正確な計算は、よりうまく機能します(最近の計算能力では、これは問題ではありません)。誤差のガウス分布を仮定したt分布は正確ではありません(pを過大評価し、アルファレベルを超えることは「現実」ではあまり起こりません)。次の比較を参照してください。

    # trying all 100 possible outcomes if the true value is p=0.7
    px <- dbinom(0:100,100,0.7)
    p_model = rep(0,101)
    for (i in 0:100) {
      xi = c(rep(1,i),rep(0,100-i))
      model = glm(xi ~ 1, offset=rep(qlogis(0.7),100), family="binomial")
      p_model[i+1] = 1-summary(model)$coefficients[4]
    }
    
    
    # plotting cumulative distribution of outcomes
    outcomes <- p_model[order(p_model)]
    cdf <- cumsum(px[order(p_model)])
    plot(1-outcomes,1-cdf, 
         ylab="cumulative probability", 
         xlab= "calculated glm p-value",
         xlim=c(10^-4,1),ylim=c(10^-4,1),col=2,cex=0.5,log="xy")
    lines(c(0.00001,1),c(0.00001,1))
    for (i in 1:100) {
      lines(1-c(outcomes[i],outcomes[i+1]),1-c(cdf[i+1],cdf[i+1]),col=2)
    #  lines(1-c(outcomes[i],outcomes[i]),1-c(cdf[i],cdf[i+1]),col=2)
    }
    
    title("probability for rejection as function of set alpha level")

    CDF of rejection by alpha

    黒い曲線は平等を表します。赤い曲線はその下にあります。つまり、glmサマリー関数によって計算された特定のp値に対して、p値が示すよりも実際にはこの状況(または大きな差)の頻度が低いことがわかります。


うーん。GLMにT分布を使用する理由について混乱しているかもしれません。ここで尋ねた関連の質問でピークを迎えることはできますか?
アダモ

2
この答えは興味深いですが、問題があります。(1)OPは、スコア、カイ2乗、「正確」、GLMベースの2項反応に関する仮説をテストするアプローチの違いについて実際に質問しませんでした(実際、これらすべてをすでに知っている可能性があります)。 t尋ねられた質問に答える。(2)残差分散などの推定値には、線形モデルとは異なる仮定とサンプリング分布のセットがあるため(@AdamOの質問のように)、t検定の使用は議論の余地があります。...
ベンボルカー

2
(3)二項応答のための「正確な」信頼区間であり、実際にトリッキー(「正確」[Clopper-ウィルソン]間隔が保守的であり、スコア試験がいくつかの範囲にわたって良好に機能することができる
ベンBolker

@Benあなたは、z検定siが実際にt検定よりも優れていることは正しいです。回答に表示されるグラフは、z検定用です。GLM関数の出力を使用します。私の答えの一番下の行は、「p値」がトリッキーなものであるということでした。したがって、glm関数からp値を抽出するよりも、たとえば正規分布を使用して明示的に計算する方が良いことがわかります。glm関数はオフセットで非常に便利にシフトされていますが、p値の計算の起源を隠しています。
Sextus Empiricus

1
@BenBolker、正確なテストは確かに保守的であると信じていますが、実際には完全な二項分布からサンプリングしていないためです。代替のz検定は、経験的な観点からのみ優れています。2つの「エラー」は互いに相殺します。1)実際の状況での残差の実際の分布ではない2項分布、2)2項分布の正確な表現ではないz分布。実際には「OK」であるという理由だけで、間違ったモデルに対して間違った分布を好むべきかどうかは疑問です。
セクストゥスエンピリカス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.