Как использовать вес выборки в GAM (mgcv) для данных обследования для регрессии Logit? - PullRequest
7 голосов
/ 26 мая 2019

Я заинтересован в проведении регрессии GAM на данных общенационального опроса, который представляет вес выборки. Я с интересом прочитал этот пост . Я выбрал интересующие меня переменные, генерирующие DF:

nhanesAnalysis <- nhanesDemo %>%
                    select(fpl,
                           age,
                           gender,
                           persWeight,
                           psu,
                           strata)

Тогда, для того, что я понял, я сгенерировал взвешенный DF со следующим кодом:

library(survey)    
nhanesDesign <- svydesign(    id      = ~psu,
                              strata  = ~strata,
                              weights = ~persWeight,
                              nest    = TRUE,
                              data    = nhanesAnalysis)

Допустим, я бы выбрал только предметы с age≥30:

ageDesign <- subset(nhanesDesign, age >= 30)

Теперь я бы подстроил модель GAM (fpl ~ s(age) + gender) с mgcv package. Можно ли это сделать с помощью аргумента weights или с помощью svydesign object ageDesign?

EDIT

Мне было интересно, правильно ли экстраполировать вычисленные веса из объекта svyglm и использовать его для аргумента weights в GAM.

1 Ответ

1 голос
/ 07 июля 2019

Это сложнее, чем кажется. Есть два вопроса

  1. Вы хотите получить правильное количество сглаживания
  2. Вы хотите допустимые стандартные ошибки.

Простое присвоение весов выборки mgcv::gam() не подойдет ни к одному из следующих: gam() обрабатывает весовые коэффициенты как весовые частоты и поэтому будет думать, что у него гораздо больше данных, чем на самом деле. Из-за весов вы получите недооцененные и недооцененные стандартные ошибки, а также, вероятно, недооцененные стандартные ошибки из-за кластерной выборки.

Простой обходной путь - использовать сплайны регрессии (пакет splines). Они не так хороши, как штрафные сплайны, используемые mgcv, но разница обычно не имеет большого значения, и они работают напрямую с svyglm. Вам нужно выбрать, сколько степеней свободы назначать.

library(splines)
svglm(fpl ~ ns(age,4) + gender, design = nhanesDesign)
...