Estou muito confuso com a forma como o peso funciona em glm com family = "binomial". No meu entendimento, a probabilidade do glm com family = "binomial" é especificada da seguinte forma: onde é a "proporção de sucesso observado" e é o número conhecido de tentativas.
No meu entendimento, a probabilidade de sucesso é parametrizada com alguns coeficientes lineares como e função glm com family = "binomial" procure por:
Portanto, se deixarmos para todos para alguma constante , também deve ser verdade que:
O arquivo de ajuda da glm diz:
"For a binomial GLM prior weights are used to give the number of trials
when the response is the proportion of successes"
Portanto, eu esperava que a escala de peso não afetasse o valor estimado dada a proporção de sucesso como resposta. No entanto, os dois códigos a seguir retornam valores diferentes de coeficiente:
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)
Isso produz:
Call: glm(formula = Y ~ 1, family = "binomial", weights = w)
Coefficients:
(Intercept)
-2.197
enquanto que se eu multiplicar todos os pesos por 1000, os coeficientes estimados são diferentes:
glm(Y~1,weights=w*1000,family=binomial)
Call: glm(formula = Y ~ 1, family = binomial, weights = w * 1000)
Coefficients:
(Intercept)
-3.153e+15
Eu vi muitos outros exemplos como esse, mesmo com uma escala moderada de pesos. O que está acontecendo aqui?
weights
argumento termina em dois lugares dentro daglm.fit
função (em glm.R ), que é o que funciona em R: 1) nos resíduos de desvio, por meio da função Cbinomial_dev_resids
(em family.c ) e 2) no IWLS passo a passo deCdqrls
(em lm.c ). Eu não sei o suficiente C a ser de mais ajuda no rastreamento da lógicaRespostas:
Seu exemplo está apenas causando erro de arredondamento em R. Pesos grandes não têm bom desempenho
glm
. É verdade que o dimensionamentow
de praticamente qualquer número menor, como 100, leva às mesmas estimativas que as não dimensionadasw
.Se você deseja um comportamento mais confiável com os argumentos de ponderação, tente usar a
svyglm
função dosurvey
pacote.Veja aqui:
fonte
glm.fit
family$initialize
glm.fit
O
$intialize
código relevante é:Aqui está uma versão simplificada do
glm.fit
que mostra o meu pontoPodemos repetir a última parte mais duas vezes para ver que o método de Newton-Raphson diverge:
Isso não acontece se você começar
weights <- 1:nrow(y)
ou dizerweights <- 1:nrow(y) * 100
.Observe que você pode evitar divergências configurando o
mustart
argumento. Eg fazerfonte
mustart
argumento). Parece um assunto relacionado à estimativa inicial ruim .