Как запустить цикл внутри цикла для игрового объекта

Я пытаюсь предсказать новые наблюдения после многократного вменения. И новые данные, и используемая модель являются объектами списков. Вопрос не в правильности подхода, а в том, как использовать функцию прогнозирования после многократного вменения. У меня есть новые данные, которые представляют собой список. Ниже мой код.

library(betareg)
library(mice)
library(mgcv)
data(GasolineYield)
dat1 <- GasolineYield

dat1 <- GasolineYield
dat1$yield <- with(dat1,
ifelse(yield > 0.40 | yield < 0.17,NA,yield)) # created missing values

datim <- mice(dat1,m=30) #imputing missing values
mod1 <- with(datim,gam(yield ~ batch + emp,family=betar(link="logit"))) #fit models using gam

создание набора данных, который будет использоваться для прогнозирования

datnew <- complete(datim,"long")
datsplit <- split(datnew,datnew$.imp)

приведенный ниже код просто проверяет прогноз без новых данных. Проблема, которую я заметил, заключалась в том, что tp сохраняется как матрица 1 на 32 вместо матрицы 30 на 32. Но опция печати печатает 30 на 32, но тогда я не мог сохранить его как таковой.

tot <- 0
for(i in 1:30){
tot <- mod1$analyses[[i]]
tp <- predict.gam(tot,type = "response")
print(tp)
}

в приведенном ниже коде я пытаюсь предсказать новое наблюдение, используя newdata. Здесь я просто потерялся, я не знаю, как это сделать.

datnew <- complete(datim,"long")
datsplit <- split(datnew,datnew$.imp)
tot <- 0
for(i in 1:30){
tot <- mod1$analyses[[i]]
tp <- predict.gam(tot,newdata=datsplit[[i]], type = "response")
print(tp)
}

Может ли кто-нибудь помочь мне решить, как лучше всего это сделать?


r gam
person JJceey    schedule 03.02.2019    source источник
comment
Какие пакеты вы используете? Покажи library() звонки. Я бы не стал использовать with() вокруг модельной функции - для этого нужен аргумент data. На заметку: убедитесь, что каждый компонент datsplit содержит все переменные, использованные в исходной модели.   -  person Gavin Simpson    schedule 03.02.2019
comment
Я использую следующие библиотеки: mice, mgcv и betareg. Функция with предназначена для запуска модели для каждого набора данных вменения.   -  person JJceey    schedule 03.02.2019
comment
Вам не нужно with(); вот для чего нужен data аргумент gam().   -  person Gavin Simpson    schedule 04.02.2019


Ответы (1)


Я наконец нашел решенную проблему. Вот решение:

datnew <- complete(datim,"long")# stack all the imputation data

хотя я должен указать, что это должен быть ваш новый набор данных

Я предполагаю, что это не используется при построении модели. Моя цель открытия этой #thread состояла в том, чтобы решить вопрос о том, как прогнозировать наблюдения с использованием новых данных после многократного вменения / использования модели, построенной с использованием нескольких наборов данных вменения.

datsplit <- split(datnew,datnew$.imp)
tot <- list()
tot_ <- list()
for(i in 1:30){
for(j in 1:30){
tot[[j]] <- predict.gam(mod1$analyses[[i]],newdata=datsplit[[j]])
}
tot_[[i]] <- tot
}
# flatten the lists within lists
totfl <- tot_ %>% flatten()
#nrow is the number of observations to be predicted as contained in the 
#newdata set (datsplit)
totn <- matrix(unlist(totfl),nrow=32) 
apply(totn,1,mean) #takes the means of prediction across the 30 data set

Надеюсь, это поможет тем, у кого есть похожие вопросы. Однажды я столкнулся с вопросом о том, как предсказать новые данные после многократного вменения, я думаю, это ответит на некоторые вопросы, содержащиеся в этой ветке.

person JJceey    schedule 04.02.2019