Rの二項GLMの応答の入力形式


13

R、使用してロジスティック回帰のための入力データをフォーマットするための3つの方法があるglm関数は:

  1. データは、観測ごとに「バイナリ」形式にすることができます(たとえば、観測ごとにy = 0または1)。
  2. データは「Wilkinson-Rogers」形式(例:)で、y = cbind(success, failure)各行が1つの処理を表します。または
  3. データは、観測ごとに加重形式にすることができます(たとえば、y = 0.3、加重= 10)。

3つのアプローチはすべて同じ係数推定値を生成しますが、自由度と結果の逸脱値とAICスコアが異なります。最後の2つの方法では、観測値の数ごとに各処理を使用するのに対し、最初の方法では観測値の数ごとに各観測値を使用するため、観測値が少なくなります(したがって自由度)。

私の質問:ある入力形式を別の入力形式よりも使用することには、数値的または統計的な利点がありますか?私が見る唯一の利点はR、モデルで使用するためにデータを再フォーマットする必要がないことです。

私はglmのドキュメントを見て、ウェブで検索し、このサイトで接線的に関連する投稿を見つけましたが、このトピックに関するガイダンスはありません。

この動作を示すシミュレーション例は次のとおりです。

# Write function to help simulate data
drc4 <- function(x, b =1.0, c = 0, d = 1, e = 0){
    (d - c)/ (1 + exp(-b * (log(x)  - log(e))))
}
# simulate long form of dataset
nReps = 20
dfLong <- data.frame(dose = rep(seq(0, 10, by = 2), each = nReps))
dfLong$mortality <-rbinom(n = dim(dfLong)[1], size = 1,
                              prob = drc4(dfLong$dose, b = 2, e = 5))

# aggregate to create short form of dataset
dfShort <- aggregate(dfLong$mortality, by = list(dfLong$dose), 
                     FUN = sum)
colnames(dfShort) <- c("dose", "mortality")
dfShort$survival <- nReps - dfShort$mortality 
dfShort$nReps <- nReps
dfShort$mortalityP <- dfShort$mortality / dfShort$nReps

fitShort <- glm( cbind(mortality, survival) ~ dose, 
                 data = dfShort, 
                 family = "binomial")
summary(fitShort)

fitShortP <- glm( mortalityP ~ dose, data = dfShort, 
                  weights = nReps,     
                  family = "binomial")
summary(fitShortP)

fitLong <- glm( mortality ~ dose, data = dfLong, 
                family = "binomial")
summary(fitLong)

1
あなたの例では、3つのモデルすべてについて、ヌルと残差の差が等しくなっています。パラメーターを追加または削除すると、AICの変更も3つすべてで同じになります。
ジョニーローモンド

1
あなたは自分自身に答えました。同じデータを同じ結果に使用する場合、どのように異なるのでしょうか?さらに、データが異なる形式で提供されているためだけにメソッドが異なる結果を提供する場合、その方法またはその実装に重大な問題が発生します。
ティム

WR形式は、最終的には加重尤度です。重みの問題は、Rが頻度の重み、確率の重み、またはその他であるかどうかを判断できないことです。調査の重み付けを使用すると、たとえば、n個の観測値しか得られない場合がありますが、それらは母集団/サンプリングフレームのセグメントを表します。したがって、自由度は実際に100です。svyglm調査パッケージから、重量引数を処理するより良い方法が提供されます。
AdamO

しかし、3種類すべてのコーディング方法を使用して準二項モデルを適合させると、異なる結果が得られます。なぜなら、二項データとしてコーディングした場合は正の過分散があり、ロジスティック/バイナリデータとしてコーディングした場合はそうではないからです。それとも私はこれで間違っていますか?
トムウェンセリアーズ

回答:


9

概念的な明確さ以外に、どちらか一方を好む統計的な理由はありません。報告された逸脱値は異なりますが、これらの違いは飽和モデルに完全に起因します。したがって、飽和したモデルの対数尤度がキャンセルされるため、モデル間の相対偏差を使用した比較は影響を受けません。

明示的な逸脱計算を行うと便利だと思います。

npiiyijji

長い形式

ij(log(pi)yij+log(1pi)(1yij)

jログyjyj+ログ1yj1yj
yjログ00log(0)limx0+xlog(x)

ショートフォーム(加重)

二項分布は実際に非整数値を取ることはできませんが、それでも各セルで観測された成功の割合を応答として使用し、対数尤度計算の各加数に重みを付けることにより、「対数尤度」を計算できます。そのセル内の観測値の数。

ini(log(pi)jyij/ni+log(1pi)(1j(yij/ni))

j

一方、飽和偏差は異なります。観測ごとに1つのパラメーターがあっても、0-1の応答がなくなったため、正確に0を取得できません。代わりに、飽和モデルの対数尤度は

ini(log(jyij/ni)jyij/ni+log(1jyij/ni)(1jyij/ni)).

この例では、この量の2倍が、両方のモデルについて報告されたヌル値と残差偏差値の差であることを確認できます。

ni = dfShort$nReps
yavg = dfShort$mortalityP
sum.terms <-ni*(log(yavg)*yavg + log(1 - yavg)*(1 - yavg))
# Need to handle NaN when yavg is exactly 0
sum.terms[1] <- log(1 - yavg[1])*(1 - yavg[1])

2*sum(sum.terms)
fitShortP$deviance - fitLong$deviance

飽和モデルの逸脱の表現を明確にする必要があると思います。0のログはあまりうまく機能しません。
AdamO

おかげで、私が意味することを明確にすべきでした。0log(0)でこのコンテキストでは0を意味することを明確にするために編集を追加しました。
ジョニーローモンド

わかりましたが、私はきちんと混同しています(許してください。逸脱を詳細に扱ったことはありません):飽和モデルの逸脱としてlog(y)y-log(1-y)(1-y)がある場合、観測値は0だけですか?
AdamO

2
「飽和モデル」は、観測ごとに1つのパラメーターを持つ想像モデルです。したがって、すべての観測値の予測確率は、実際の観測値に応じて1または0です。したがって、この場合、飽和モデルの対数尤度は実際には0であり、データは飽和モデルによって生成される唯一のデータです。
ジョニーローモンド

しかし、3種類すべてのコーディング方法を使用して準二項モデルを適合させると、異なる結果が得られます。なぜなら、二項データとしてコーディングした場合は正の過分散があり、ロジスティック/バイナリデータとしてコーディングした場合はそうではないからです。それとも私はこれで間違っていますか?
トムウェンセリアーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.