Je suis très confus avec la façon dont le poids fonctionne en glm avec family = "binomial". À ma connaissance, la probabilité du glm avec family = "binomial" est spécifiée comme suit: où y est la "proportion de succès observée" et n est le nombre connu d'essais.yn
À ma connaissance, la probabilité de succès est paramétrée avec certains coefficients linéaires comme et la fonction glm avec family = "binomial" recherche:
Par conséquent, si nous laissons pour tout pour une constante , alors il doit également être vrai que:
Le fichier d'aide de glm indique:
"For a binomial GLM prior weights are used to give the number of trials
when the response is the proportion of successes"
Par conséquent, je m'attendais à ce que la mise à l'échelle du poids n'affecte pas la estimée étant donné la proportion de succès en tant que réponse. Cependant, les deux codes suivants renvoient des valeurs de coefficient différentes:
Y <- c(1,0,0,0) ## proportion of observed success
w <- 1:length(Y) ## weight= the number of trials
glm(Y~1,weights=w,family=binomial)
Cela donne:
Call: glm(formula = Y ~ 1, family = "binomial", weights = w)
Coefficients:
(Intercept)
-2.197
alors que si je multiplie tous les poids par 1000, les coefficients estimés sont différents:
glm(Y~1,weights=w*1000,family=binomial)
Call: glm(formula = Y ~ 1, family = binomial, weights = w * 1000)
Coefficients:
(Intercept)
-3.153e+15
J'ai vu de nombreux autres exemples comme celui-ci, même avec une mise à l'échelle modérée des poids. Qu'est-ce qui se passe ici?
weights
argument se retrouve à deux endroits à l'intérieur de laglm.fit
fonction (dans glm.R ), ce qui fait le travail dans R: 1) dans les résidus de déviance, par le biais de la fonction Cbinomial_dev_resids
(dans family.c ) et 2) dans l'étape IWLS au moyen deCdqrls
(en lm.c ). Je ne connais pas assez de C pour être plus utile dans le traçage de la logiqueRéponses:
Votre exemple provoque simplement une erreur d'arrondi dans R. Les grands poids ne fonctionnent pas bien dans
glm
. Il est vrai que la misew
à l' échelle de pratiquement n'importe quel nombre plus petit, comme 100, conduit aux mêmes estimations que celles non mises à l'échellew
.Si vous voulez un comportement plus fiable avec les arguments de poids, essayez d'utiliser la
svyglm
fonction dusurvey
package.Vois ici:
la source
glm.fit
family$initialize
glm.fit
Le
$intialize
code pertinent est:Voici une version simplifiée
glm.fit
qui montre mon pointNous pouvons répéter la dernière partie deux fois de plus pour voir que la méthode de Newton-Raphson diverge:
Cela ne se produit pas si vous commencez
weights <- 1:nrow(y)
ou ditesweights <- 1:nrow(y) * 100
.Notez que vous pouvez éviter la divergence en définissant l'
mustart
argument. Par exemple fairela source
mustart
argument). Cela semble être une question liée à une mauvaise estimation initiale .