Использование весов для повторных случаев в 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 степенях свободы"