Comment puis-je calculer la statistique de test Pearson pour le manque d'ajustement sur un modèle de régression logistique dans R?

10

Le rapport de vraisemblance (aka déviance) statistique et test de manque d'ajustement (ou qualité d'ajustement) est assez simple à obtenir pour un modèle de régression logistique (ajustement à l'aide de la fonction) dans R. Cependant, il peut être il est facile de faire en sorte que le nombre de cellules soit suffisamment bas pour que le test ne soit pas fiable. Une façon de vérifier la fiabilité du test de rapport de vraisemblance pour le manque d'ajustement consiste à comparer sa statistique de test et sa valeur P à celles du test de Chi Chi de Pearson (ou ).χ 2G2glm(..., family = binomial)χ2

Ni l' glmobjet ni sa summary()méthode ne rapportent la statistique de test pour le test du chi carré de Pearson pour manque d'ajustement. Dans ma recherche, la seule chose que j'ai trouvée est la chisq.test()fonction (dans le statspackage): sa documentation dit " chisq.testeffectue des tests de table de contingence chi carré et des tests de qualité d'ajustement". Cependant, la documentation est rare sur la façon d'effectuer de tels tests:

Si xest une matrice avec une ligne ou une colonne, ou si xest un vecteur et yn'est pas donné, alors un test de qualité d'ajustement est effectué ( xest traité comme un tableau de contingence unidimensionnel). Les entrées de xdoivent être des entiers non négatifs. Dans ce cas, l'hypothèse testée est de savoir si les probabilités de population sont égales à celles de p, ou sont toutes égales si elle pn'est pas donnée.

J'imagine que vous pourriez utiliser le ycomposant de l' glmobjet pour l' xargument de chisq.test. Cependant, vous ne pouvez pas utiliser le fitted.valuescomposant de l' glmobjet pour l' pargument de chisq.test, car vous obtiendrez une erreur: " probabilities must sum to 1."

Comment puis-je (dans R) au moins calculer la statistique du test Pearson pour le manque d'ajustement sans avoir à parcourir les étapes manuellement?χ2

Firefeather
la source

Réponses:

13

La somme des résidus Pearson au carré est exactement égale à la statistique du test Pearson pour manque d'ajustement. Donc, si votre modèle ajusté (c'est-à-dire l' objet) est appelé , le code suivant retournera la statistique de test:χ2glmlogistic.fit

sum(residuals(logistic.fit, type = "pearson")^2)

Consultez la documentation sur residuals.glmpour plus d'informations, y compris les autres résidus disponibles. Par exemple, le code

sum(residuals(logistic.fit, type = "deviance")^2)

vous obtiendrez la statistique de test , tout comme celle fournie.G2deviance(logistic.fit)

Firefeather
la source
Je suis d'accord avec Macro. Si vous vouliez des réponses du groupe, vous auriez dû attendre pour entendre ce que les autres ont à dire en premier. Tout ce que vous pourriez obtenir maintenant est biaisé en voyant votre réponse. De plus, si vous connaissez la réponse, qu'essayez-vous de prouver en faisant cela?
Michael R. Chernick
@Macro - Firefeather a posté quatre questions sur ce site (y compris celui-ci) et a répondu à trois d'entre elles (y compris celle-ci) lui-même, acceptant une de ses propres réponses une fois. Un peu plus comme ça et je pourrais commencer à voir un motif!
jbowman
@jbowman, je peux imaginer répondre à votre propre question si vous l'avez compris par vous-même avant que quelqu'un d'autre ait posté une réponse mais firefeather a posté une réponse littéralement moins de 5 minutes après avoir posté la question, il semble qu'il / elle n'avait pas besoin d'aide , c'est ce qui m'a fait demander pourquoi ... Je ne comprends pas vraiment la motivation ...
Macro
3
@Macro, veuillez consulter ce lien officiel: blog.stackoverflow.com/2011/07/… (il est lié sur la page Poser une question dans la case à cocher en bas: "Répondez à votre propre question - partagez vos connaissances, style Q & A "). J'ai eu cette question pendant que je faisais mes devoirs (ayant choisi d'utiliser R au lieu de Minitab, bien que Minitab ait été démontré en classe), mais je n'ai pas eu assez de temps pour taper la question et attendre une réponse. J'ai trouvé cette solution de contournement et j'ai décidé de la partager avec la communauté.
Firefeather
2
@Macro, vous êtes les bienvenus! J'aimerais pouvoir poser plus de questions où je ne donne pas la réponse, et répondre à plus de questions que je n'ai pas posées. Mais jbowman du droit d'un motif: mes contributions à la communauté sont tend vers parler à moi - même. :) (Au moins je contribue d'une manière ou d'une autre à la communauté, non?)
Firefeather
10

La statistique de Pearson a une distribution dégénérée et n'est donc pas recommandée en général pour la qualité de l'ajustement du modèle logistique. Je préfère les tests structurés (linéarité, additivité). Si vous voulez un test omnibus, voyez le seul degré de liberté le Cessie - van Houwelingen - Copas - Hosmer test de somme des carrés non pondéré tel qu'implémenté dans la fonction de rmspackage R.residuals.lrm

Frank Harrell
la source
2
-1: Merci pour la perspicacité! Cependant, cela ne répond pas à ma question. Parce qu'il s'agit d'un commentaire / discussion pertinent sur une déclaration que j'ai faite en arrière-plan de ma question, votre réponse appartient probablement à un commentaire, plutôt qu'à une réponse.
Firefeather
2
Je suppose que les quatre personnes qui ont voté pour ma réponse ne sont pas d'accord avec vous. Et vous n'avez pas traité de la distribution dégénérée.
Frank Harrell
@FrankHarrell: Cette mesure GOF est-elle différente du test GOF Hosmer-Lemeshow (HL)? En supposant que ce soit à cause du nom, et nous avons également comparé les deux: test HL GOF conduit comme indiqué dans le ResourceSelectionpackage, et son résultat est différent de ce que j'obtiens en exécutant resid(lrm_object, 'gof')après avoir ajusté mon modèle de régression logistique lrm_object <- lrm(...). S'ils sont effectivement différents, pouvez-vous nous dire comment le test HL se compare à celui que vous mentionnez ici? Je vous remercie!
Meg
1
Les deux sont très différents. La statistique HL (désormais obsolète) a fixé df et est généralement basée sur des déciles de risque. La statistique HL n'est donc pas dégénérée comme . D'autre part, méfiez - vous de tout statistique où le df continue son expansion avec . N χ 2 Nχ2Nχ2N
Frank Harrell
J'aimerais voir une simulation qui montre cette dégénérescence.
wdkrnls
0

Merci, je ne savais pas que c'était aussi simple que: somme (résidus (f1, type = "pearson") ^ 2) Cependant, veuillez noter que le résidu Pearsons varie selon qu'il est calculé par groupe de covariables ou par individu. Un exemple simple:

m1 est une matrice (celle-ci est la tête d'une matrice plus grande):

m1 [1: 4,1: 8]

    x1 x2 x3 obs    pi   lev  yhat y
obs  1  1 44   5 0.359 0.131 1.795 2
obs  0  1 43  27 0.176 0.053 4.752 4
obs  0  1 53  15 0.219 0.062 3.285 1
obs  0  1 33  22 0.140 0.069 3.080 3

Lorsque x1-3 sont des prédicteurs, obs est non. observations dans chaque groupe, pi est la probabilité d'appartenance au groupe (prédite à partir de l'équation de régression), lev est l'effet de levier, la diagonale de la matrice du chapeau, yhat le non prédit. (de y = 1) dans le groupe et y le no réel.

Cela vous donnera Pearson par groupe. Notez comment c'est différent si y == 0: ' 'fun1 <- function(j){        if (m1[j,"y"] ==0){ # y=0 for this covariate pattern     Pr1 <- sqrt( m1[i,"pi"] / (1-m1[i,"pi"]))     Pr2 <- -sqrt (m1[i,"obs"]) res <- round( Pr1 * Pr2, 3) return(res) } else {  Pr1 <- m1[j,"y"] - m1[j,"yhat"] Pr2 <- sqrt(   m1[j,"yhat"] * ( 1-(m1[j,"pi"]) )   ) res <- round( Pr1/Pr2, 3) return(res) }    }

Donc

nr <-nrow(m1)
nr1 <- seq(1,nr)
Pr <- sapply(1:nrow[m1], FUN=fun1)
PrSj <- sum(Pr^2)

S'il y a un grand nombre de sujets avec des modèles de covariables y = 0, alors le résidu de Pearons sera beaucoup plus grand lorsqu'il est calculé en utilisant la méthode «par groupe» plutôt que la méthode «par individu».

Voir par exemple Hosmer et Lemeshow "Applied Logistic Regression", Wiley, 200.

dardisco
la source
0

Vous pouvez également utiliser c_hat(mod)ce qui donnera la même sortie que sum(residuals(mod, type = "pearson")^2).

user54098
la source
1
Dans quel paquet se c_hattrouve- t- on?
Firefeather