Меня очень смущает то, как вес работает в glm с family = "binomial". В моем понимании вероятность появления glm с family = "binomial" определяется следующим образом: где - «доля наблюдаемого успеха», а n - известное количество испытаний.
В моем понимании вероятность успеха параметризована некоторыми линейными коэффициентами такими как и функцией glm с family = "binomial", для поиска:
Поэтому, если мы допустим для всех для некоторой константы , то также должно быть верно, что:
Файл справки glm говорит:
"For a binomial GLM prior weights are used to give the number of trials
when the response is the proportion of successes"
Поэтому я ожидал, что масштабирование веса не повлияет на оценку учитывая долю успеха в качестве ответа. Однако следующие два кода возвращают разные значения коэффициентов:
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)
Это дает:
Call: glm(formula = Y ~ 1, family = "binomial", weights = w)
Coefficients:
(Intercept)
-2.197
тогда как если я умножу все веса на 1000, оценочные коэффициенты будут другими:
glm(Y~1,weights=w*1000,family=binomial)
Call: glm(formula = Y ~ 1, family = binomial, weights = w * 1000)
Coefficients:
(Intercept)
-3.153e+15
Я видел много других примеров, подобных этому, даже с некоторым умеренным масштабированием весов. Что здесь происходит?
weights
аргумент заканчивается в двух местах внутриglm.fit
функции (в glm.R ), что и делает работа в R: 1) в остатках отклонения, через функцию Cbinomial_dev_resids
(в family.c ) и 2) на этапе IWLS посредствомCdqrls
(в lm.c ). Я не знаю достаточно C, чтобы больше помочь в отслеживании логикиОтветы:
Ваш пример просто вызывает ошибку округления в R. Большие веса не работают хорошо в
glm
. Это правда, что масштабированиеw
практически на любое меньшее число, например 100, приводит к тем же оценкам, что и немасштабированноеw
.Если вы хотите более надежного поведения с весовыми аргументами, попробуйте использовать
svyglm
функцию изsurvey
пакета.Посмотреть здесь:
источник
Я думаю , что это сводится к первоначальным значениям , которые используются вW--√Икс Икс W--√ здесь . То есть использует метод Ньютона-Рафсона.
glm.fit
изfamily$initialize
которых делает метод divergere. Насколько я знаю,glm.fit
решить эту проблему, сформировав QR-разложение где - матрица проектирования, а - диагональ с квадратными корнями из элементов, как описаноСоответствующий
$intialize
код:Вот упрощенная версия,
glm.fit
которая показывает мою точку зренияМы можем повторить последнюю часть еще два раза, чтобы увидеть, что метод Ньютона-Рафсона расходится:
Этого не произойдет, если вы начнете с
weights <- 1:nrow(y)
или говоритеweights <- 1:nrow(y) * 100
.Обратите внимание, что вы можете избежать расхождений, установив
mustart
аргумент. Например сделатьисточник
mustart
аргумент). Это похоже на вопрос, связанный с плохой первоначальной оценкой .