Как запустить цикл внутри цикла для игрового объекта - PullRequest
0 голосов
/ 03 февраля 2019

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

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)
}

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

1 Ответ

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

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

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

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

...