GLM-Standardfehler

7

Ich habe eine Frage, wie ich die Standardfehler der Koeffizienten in meinem GLM-Modell erhalten kann. Ich habe die Fischerinformationsmatrix, die ich von Hand berechnet habe, aber sie ist nicht skaliert. Wie kann ich die Fischerinformationsmatrix so skalieren, dass die GLM-Funktion dieselben Standardfehler enthält?

T. Nestor
quelle
Können Sie ein reproduzierbares Beispiel liefern? Passen Sie ein Modell mit glm () an und zeigen Sie, wie Sie die FI-Matrix erhalten?
Atiretoo - Wiedereinstellung Monica
Ich habe die Fischerinformationsmatrix mit berechnet , wobei die Gewichtsmatrix ist. Wenn ich mir meine Ergebnisse , stimmen sie genau mit denen überein, die ich bekomme, wenn ich mir 'summary (m1) . Dies gibt mir jedoch nicht die Standardfehler jedes Koeffizienten. Muss ich einen Skalenparameter berechnen ? Der Dispersionsparameter für mein Modell ist 1.(XTWX)1Wcov.unscaledϕ
T. Nestor

Antworten:

6

Du bist sehr nah! Die Standardfehler der Koeffizienten sind die Quadratwurzeln der Diagonale Ihrer Matrix, die die Umkehrung der Fisher-Informationsmatrix ist. Hier ist ein Beispiel.


data <- caret::twoClassSim()
model <- glm(Class~TwoFactor1*TwoFactor2, data = data, family="binomial")
# here are the standard errors we want
SE <- broom::tidy(model)$std.error

X <- model.matrix(model)
p <- fitted(model)
W <- diag(p*(1-p))
# this is the covariance matrix (inverse of Fisher information)
V <- solve(t(X)%*%W%*%X)
all.equal(vcov(model), V)
#> [1] "Mean relative difference: 1.066523e-05"
# close enough

# these are the standard errors: take square root of diagonal 
all.equal(SE, sqrt(diag(V)))
#> [1] "names for current but not for target"  
#> [2] "Mean relative difference: 4.359204e-06"
atiretoo - Monica wieder einsetzen
quelle
5

Wie kann ich die Fischerinformationsmatrix so skalieren, dass die GLM-Funktion dieselben Standardfehler enthält?

Setzen Sie Ihre nicht skalierte Kovarianzmatrix auf den Dispersionsparameter, wie in ausgeführt summary.glm. Der relevante Code von summary.glmist

if (is.null(dispersion)) 
    dispersion <- if (object$family$family %in% c("poisson", 
        "binomial")) 
        1
    else if (df.r > 0) {
        est.disp <- TRUE
        if (any(object$weights == 0)) 
            warning("observations with zero weight not used for calculating dispersion")
        sum((object$weights * object$residuals^2)[object$weights > 
            0])/df.r
    }
    else {
        est.disp <- TRUE
        NaN
    }
# [other code...]
if (p > 0) {
    p1 <- 1L:p
    Qr <- qr.lm(object)
    coef.p <- object$coefficients[Qr$pivot[p1]]
    covmat.unscaled <- chol2inv(Qr$qr[p1, p1, drop = FALSE])
    dimnames(covmat.unscaled) <- list(names(coef.p), names(coef.p))
    covmat <- dispersion * covmat.unscaled
    # [more code ...]

Die chol2inv(Qr$qr[p1, p1, drop = FALSE])Berechnungen denen Sie einen Kommentar abgeben. Hier ist die obere Dreiecksmatrix aus der QR - Zerlegung .(RR)1=(XWX)1RQR=WX


atiretoo Antworten gelten nur, wenn der Dispersionsparameter eins ist, wie bei der Poisson- und Binomialverteilung.

Benjamin Christoffersen
quelle