ポアソン回帰を使用したバイナリデータの調整済みリスク比の推定


9

ロジスティック回帰を使用して調整オッズ比を推定する方法に類似した、調整リスク比の推定に興味があります。一部の文献(例:this)は、Huber-White標準誤差でポアソン回帰を使用することが、これを行うためのモデルベースの方法であることを示しています

連続共変量の調整がこれにどのように影響するかについては、文献を見つけていません。次の簡単なシミュレーションは、この問題がそれほど単純ではないことを示しています。

arr <- function(BLR,RR,p,n,nr,ce)
{
   B = rep(0,nr)
   for(i in 1:nr){
   b <- runif(n)<p 
   x <- rnorm(n)
   pr <- exp( log(BLR) + log(RR)*b + ce*x)
   y <- runif(n)<pr
   model <- glm(y ~ b + x, family=poisson)
   B[i] <- coef(model)[2]
   }
   return( mean( exp(B), na.rm=TRUE )  )
}

set.seed(1234)
arr(.3, 2, .5, 200, 100, 0)
[1] 1.992103
arr(.3, 2, .5, 200, 100, .1)
[1] 1.980366
arr(.3, 2, .5, 200, 100, 1)
[1] 1.566326 

この場合、真のリスク比は2で、共変量効果が小さいときに確実に回復します。ただし、共変量効果が大きい場合、これは歪められます。これは、共変量効果が上限(1)を押し上げる可能性があり、これが推定を汚染するために発生すると思います。

調整済みのリスク比推定で連続共変量を調整するための文献を調べましたが見つかりませんでした。このサイトの次の投稿を知っています。

彼らは私の質問に答えません。これに関する論文はありますか?行使すべき既知の注意事項はありますか?


1
あなたに興味があるかもしれません: aje.oxfordjournals.org/content/162/3/199.full
StatsStudent

また、このQ&Astats.stackexchange.com / questions / 18595 / が役立つ場合があります。
mdewey 2017年

回答:


1

この質問への回答が必要かどうかはわかりませんが、ポアソン回帰を使用したいという同様の問題があります。コードを実行しているときに、モデルを次のように設定すると、

model <- glm(y ~ b + x, family=binomial(logit)

ポアソン回帰モデルとしてではなく、同じ結果が発生します。ceが1に近づくと、推定ORは約1.5になります。そのため、例がバイナリ結果のポアソン回帰の使用で起こりうる問題に関する情報を提供していることはわかりません。


1
ロジットモデルのフィッティングの問題は、予測リスクが1を超えることはありませんが、オッズ比がリスク比の偏った推定値であり、その偏りが結果が普及するにつれて劇的に増加することです。binomial(link=log)実際に相対リスクモデルに適合するように指定できますが、結果を予測しすぎているため、収束することはほとんどありません。
AdamO

1

適切な確率関数で直接最尤法を使用すると、相対リスクの推定が大幅に改善されることがわかりました。切り捨てられたリスク関数をプロセスの予測率として直接指定できます。

ここに画像の説明を入力してください

通常、ヘッセ行列を使用して推定値のCIを作成します。私はそれをフーバーホワイトエラーの「B」行列(肉)として使用する可能性を探り、「A」行列(パン)を取得するためにフィッティングされたリスクを使用しました...しかし、それはうまくいくと思います!より現実的には、ブートストラップを使用して、誤って指定された平均分散関係に対してロバストなモデルエラーを取得できます。

## the negative log likelihood for truncated risk function
negLogLik <- function(best, X, y) { 
  pest <- pmin(1, exp(X %*% best))
  -sum(dpois(x = y, lambda = pest, log=TRUE))
}

set.seed(100)

sim <- replicate(100, {
  n <- 200
  X <- cbind(1, 'b'=rbinom(n, 1, 0.5), 'x'=rnorm(n))
  btrue <- c(log(0.3), log(2), 1)
  ptrue <- pmin(1, exp(X %*% matrix(btrue)))
  y <- rbinom(n, 1, ptrue) ## or just take y=ptrue for immediate results
  nlm(f = logLik, p = c(log(mean(y)),0,0), X=X, y=y)$estimate
})

rowMeans(exp(sim))

与える:

> rowMeans(exp(sim))
[1] 0.3002813 2.0680780 3.0888280

真ん中の係数はあなたが望むものを与えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.