twang
パッケージを使用して傾向スコアを作成します。これは、survey::svyglm
を使用した二項GLMの重みとして使用されます。コードは次のようになります。
pscore <- ps(ppci ~ var1+var2+.........., data=dt....)
dt$w <- get.weights(pscore, stop.method="es.mean")
design.ps <- svydesign(ids=~1, weights=~w, data=dt,)
glm1 <- svyglm(m30 ~ ppci, design=design.ps,family=binomial)
これにより、次の警告が生成されます。
Warning message:
In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!
誰かが私が間違っている可能性があることを知っていますか?
このメッセージがstats.SEの方が良いかどうかはわかりませんでしたが、バランスを考えて最初にここで試すと思いました。
glm
は、二項(およびポアソン)モデルを指定する際にうるさいです。いいえを検出すると警告します。試行または成功の統合は非整数ですが、先に進み、とにかくモデルに適合します。警告を抑制したい場合(そして、それが問題ではないと確信している場合)、family=quasibinomial
代わりに。
何も問題はありません計算、しかし統計あなたは意味のあることをしていないかもしれません。そのような場合、おそらくロバスト回帰法を使用することをお勧めします。これには、データに正確に1または正確に0の単位が含まれている場合、一般に比例応答データに適しています。
@HoongOoiが言ったように、binomial
ファミリーを持つglm.fit
は整数カウントを期待し、そうでなければ警告をスローします。整数以外のカウントが必要な場合は、quasi-binomial
を使用します。私の答えの残りはこれらを比較します。
glm.fit
のRの準二項式は、係数推定(@HongOoiのコメントに記載されている)のbinomial
とまったく同じですが、標準エラー(@nograpesのコメントに記載されている) )。
stats::binomial
とstats::quasibinomial
のソースコードの差分は、次の変更を示しています。
および次の削除:
simfun
関数はデータをシミュレートしますsimfun
のみが違いを生むことができますが、glm.fit
などのstats::binomial
によって返されるオブジェクトの他のフィールドとは異なり、mu.eta
のソースコードはその関数の使用を示しません。 link
。
quasibinomial
またはbinomial
を使用した結果は、この最小限の作業例の係数と同じです。
library('MASS')
library('stats')
gen_data <- function(n=100, p=3) {
set.seed(1)
weights <- stats::rgamma(n=n, shape=rep(1, n), rate=rep(1, n))
y <- stats::rbinom(n=n, size=1, prob=0.5)
theta <- stats::rnorm(n=p, mean=0, sd=1)
means <- colMeans(as.matrix(y) %*% theta)
x <- MASS::mvrnorm(n=n, means, diag(1, p, p))
return(list(x=x, y=y, weights=weights, theta=theta))
}
fit_glm <- function(family) {
data <- gen_data()
fit <- stats::glm.fit(x = data$x,
y = data$y,
weights = data$weights,
family = family)
return(fit)
}
fit1 <- fit_glm(family=stats::binomial(link = "logit"))
fit2 <- fit_glm(family=stats::quasibinomial(link = "logit"))
all(fit1$coefficients == fit2$coefficients)
このスレッド は、準二項分布が追加パラメーターphi
を持つ二項分布と異なることを示唆しています。しかし、それらは統計とR
で異なる意味を持ちます。
まず、ソースコードのquasibinomial
には、追加のphi
パラメーターが記載されていません。
第二に、 準確率 は確率に似ていますが、適切なものではありません。この場合、ガンマ関数を使用することはできますが、数値が非整数の場合は項(n\choose k)を計算できません。これは確率分布の定義にとっては問題かもしれませんが、項(nはkを選択)はパラメーターに依存せず、最適化から外れるため、推定には無関係です。
対数尤度推定量は次のとおりです。
二項族のシータの関数としての対数尤度は次のとおりです。
ここで、定数はパラメータシータから独立しているため、最適化から外れます。
stats :: summary.glm で説明されているように、stats::summary.glm
で計算される標準エラーは、binomial
およびquasibinomial
ファミリに異なる分散値を使用します。
GLMの分散はフィッティングプロセスでは使用されませんが、標準エラーを見つけるために必要です。
dispersion
が指定されていない場合、またはNULL
の場合、分散はbinomial
およびPoisson
ファミリの1
と見なされ、それ以外の場合は残差自由度で除算された残差カイ二乗統計量(非ゼロの重みを持つケースから計算)。...
cov.unscaled
:推定係数のスケールなし(dispersion = 1
)推定共分散行列。
cov.scaled
:同上、dispersion
でスケーリング。
上記の最小限の作業例を使用して:
summary1 <- stats::summary.glm(fit1)
summary2 <- stats::summary.glm(fit2)
print("Equality of unscaled variance-covariance-matrix:")
all(summary1$cov.unscaled == summary2$cov.unscaled)
print("Equality of variance-covariance matrix scaled by `dispersion`:")
all(summary1$cov.scaled == summary2$cov.scaled)
print(summary1$coefficients)
print(summary2$coefficients)
同じ係数、同じ非スケーリング分散共分散行列、および異なるスケーリング分散共分散行列を示します。
[1] "Equality of unscaled variance-covariance-matrix:"
[1] TRUE
[1] "Equality of variance-covariance matrix scaled by `dispersion`:"
[1] FALSE
Estimate Std. Error z value Pr(>|z|)
[1,] -0.3726848 0.1959110 -1.902317 0.05712978
[2,] 0.5887384 0.2721666 2.163155 0.03052930
[3,] 0.3161643 0.2352180 1.344133 0.17890528
Estimate Std. Error t value Pr(>|t|)
[1,] -0.3726848 0.1886017 -1.976042 0.05099072
[2,] 0.5887384 0.2620122 2.246988 0.02690735
[3,] 0.3161643 0.2264421 1.396226 0.16583365
申し訳ありませんが、基礎となるメカニズムが過分散二項モデルである場合、標準分散を推定するときに過分散二項モデルがそれを考慮に入れるという意味で、より堅牢です。したがって、ポイントの推定値が同じであっても、より良いカバレッジが得られます。