Использование весов для повторных случаев в R (и, в частности, gam для двоичного ответа)

Я заметил, что многие модели R допускают использование параметра "весов" (например, cart, loess, gam,...). Большинство функций справки описывают это как "предыдущие веса" для данных, но что это на самом деле означает?

У меня есть данные со многими повторными случаями и двоичным ответом. Я надеялся, что смогу использовать "веса", чтобы кодировать, сколько раз происходит каждая комбинация ввода и ответа, но это, похоже, не работает. Я также попытался сделать ответ пропорцией успехов и весом общих испытаний для каждой комбинации ковариат, но это, похоже, тоже не работает (по крайней мере, для игры). Я пытаюсь сделать это для всех типов моделей, перечисленных выше, но для начала, как это сделать для gam [mgcv package]?

2 ответа

Веса для биномиального ответа имеют естественную интерпретацию: количество испытаний, соответствующих каждому наблюдению. Если у вас есть n испытания которых p успехи, вы подходите с этим

glm(p/n ~ x, family=binomial, weights=n)

То же самое работает с gam в обоих gam а также mgcv пакеты.

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

SKdata = matrix(c(20,5,5,5,40,15,3,27,30,2,3,10),ncol=4)
dimnames(SKdata) = list(shoesize=10:12,height=seq(160,190,by=10))

x = as.data.frame(as.table(SKdata), stringsAsFactors=FALSE)
for (i in 1:ncol(x)) x[,i] = as.numeric(x[,i])
fit1 = lm(height ~ shoesize,data=x, weights=Freq)
summary(fit1)

Обратите внимание, что коэффициент наклона несущественен, а остаточная ошибка основана на "10 степенях свободы"

Это меняется, когда я преобразую таблицу сопряженности в "необработанные" данные, то есть по одной строке на наблюдение, с помощью вспомогательной функции expand.dft:

expand.dft <- function(x, na.strings = "NA", as.is = FALSE, dec = ".")
{
  DF <- sapply(1:nrow(x), function(i) x[rep(i, each = x$Freq[i]), ],
               simplify = FALSE)

  DF <- subset(do.call("rbind", DF), select = -Freq)

  for (i in 1:ncol(DF))
  {
    DF[[i]] <- type.convert(as.character(DF[[i]]),
                            na.strings = na.strings,
                            as.is = as.is, dec = dec)                                       
  }
  DF
} 

fit2 = lm(height ~ shoesize,data=expand.dft(x))
summary(fit2)

Мы получаем идентичный коэффициент, но на этот раз очень значимый, поскольку основан на "163 степенях свободы"

Другие вопросы по тегам