Самозагрузка с моделью glm - PullRequest
       32

Самозагрузка с моделью glm

0 голосов
/ 18 февраля 2019

У меня есть модель отрицательной биномиальной регрессии, в которой я прогнозирую количество ретвитов сообщений в Твиттере на основе использования ими определенных типов слов (слова ME, слова Moral и слова Emotional):

M1 <- glm.nb(retweetCount ~ ME_words + Moral_words + Emo_words, data = Tweets)

Теперь я хочувыполнить выборку с помощью начальной загрузки (например, выборки из 1000 с заменой из исходных 500 000 сообщений информационного кадра) из большого набора данных Tweets, чтобы выполнить итерации модели и проанализировать дисперсию коэффициентов.Каков наилучший подход к этому?Я предполагаю, что мне нужно использовать пакет boot, но я немного растерялся, с чего начать.

В идеале я хотел бы создать цикл for, который может выполнять несколько итераций, а затемсохранить коэффициенты каждой итерации модели в новом кадре данных.Это было бы чрезвычайно полезно для будущих анализов.


Вот некоторые воспроизводимые данные с очень большого массива данных Tweets:

>dput((head(Tweets, 100)))

structure(list(retweetCount = c(1388, 762, 748, 436, 342, 320, 
312, 295, 264, 251, 196, 190, 175, 167, 165, 163, 149, 148, 148, 
146, 133, 132, 126, 124, 122, 122, 121, 120, 118, 118, 114, 113, 
112, 110, 108, 107, 104, 101, 100, 96, 95, 94, 93, 92, 90, 90, 
89, 89, 87, 86, 84, 83, 83, 83, 82, 82, 82, 82, 78, 78, 78, 76, 
76, 76, 76, 74, 74, 73, 73, 72, 72, 71, 70, 70, 70, 70, 69, 69, 
69, 68, 68, 67, 65, 65, 65, 65, 63, 62, 62, 61, 61, 61, 61, 60, 
60, 59, 59, 59, 59, 58), ME_words = c(2, 2, 2, 0, 0, 1, 1, 0, 
1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 
0, 3, 0, 1, 0, 1, 1, 4, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 
0, 0, 2, 2, 0, 0, 1, 0, 1, 0, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 0, 
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 1, 0, 0), Moral_words = c(0, 0, 1, 1, 1, 2, 0, 
0, 0, 1, 0, 1, 2, 0, 1, 1, 1, 2, 0, 1, 0, 1, 1, 0, 2, 0, 1, 1, 
1, 0, 1, 1, 1, 1, 0, 2, 0, 1, 1, 1, 2, 0, 1, 1, 1, 1, 0, 1, 0, 
0, 5, 1, 1, 1, 1, 2, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 2, 0, 0, 0, 
1, 1, 2, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 
1, 1, 0, 0, 2, 2, 1, 0, 0), Emo_words = c(0, 0, 1, 1, 0, 0, 2, 
0, 1, 0, 2, 0, 1, 0, 1, 2, 0, 3, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1, 
1, 2, 0, 1, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 1, 0, 1, 1, 2, 0, 0, 
1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 0, 0, 2, 0, 0, 1, 0, 
1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 2, 1, 0, 0, 
1, 0, 0, 1, 2, 2, 0, 0, 0)), row.names = c(NA, -100L), class = c("tbl_df", 
"tbl", "data.frame"))

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете использовать пакет boot, но для простых версий начальной загрузки практически проще накатить свою собственную.

подходит для исходной модели

library(MASS)
M1 <- glm.nb(retweetCount ~ ME_words + Moral_words + 
                 Emo_words, data = Tweets)

настроить структуру данных для результатов

nboot <- 1000
bres <- matrix(NA,nrow=nboot,
                  ncol=length(coef(M1)),
                  dimnames=list(rep=seq(nboot),
                                coef=names(coef(M1))))

начальная загрузка

set.seed(101)
bootsize <- 200
for (i in seq(nboot)) {
  bdat <- Tweets[sample(nrow(Tweets),size=bootsize,replace=TRUE),]
  bfit <- update(M1, data=bdat)  ## refit with new data
  bres[i,] <- coef(bfit)
}

структура вывода

data.frame(mean_est=colMeans(bres),
      t(apply(bres,2,quantile,c(0.025,0.975))))
...