#r #dataframe #for-loop #predict
#r #фрейм данных #for-цикл #предсказать
Вопрос:
Я создал приведенный ниже цикл for, чтобы иметь дело с процессом прогнозирования по панельным данным. В то время как каждая процедура обработки данных работает как по волшебству, хранение прогнозов (последний шаг) не выполняется. Из-за некомпетентности с моей стороны (довольно новичок в циклах for) цикл for не заменяет NAs в столбцах фрейма данных, созданных для хранения, числовыми прогнозами. Что я делаю не так?
Существует 17 префектур, в каждой из которых имеется 61 наблюдение. Таким образом, для каждого из них я получаю 61 предсказание.
Используемый набор данных: https://www.dropbox.com/scl/fi/v2xk34ac58h2kk7uxunat/dt1.xlsx?dl=0amp;rlkey=gf2e15z4gtuu83lxalzn91rai
#Data prep for modeling and predictions
mydata$...1 <- NULL #remove useless column
mydata$month_year <- as.factor(mydata$month_year) #time fixed-effects
mydata$ncve_relax_lag <- as.numeric(mydata$ncve_relax_lag) #make numeric
mydata$ncve_strict_lag <- as.numeric(mydata$ncve_strict_lag)
mydata <- mydata %>% drop_na()
mydata$population <- mydata$population/10000 #scaling
mydata$area <- mydata$area/10000 #scaling
mydata$no_troops <- mydata$no_troops/1000 #scaling
#Create data frame columns to store predictions
mydata$nbpred.core <- NA
mydata$nbpred.lit <- NA
mydata$nbpred.base <- NA
#Model fitting and predictions
runPredictions <- function(){
for(i in unique(mydata$prefecture)){
print(i)
#Define training and test sets
sptllearningSet <- mydata[mydata$prefecture != i,]
sptltestSet <- mydata[mydata$prefecture == i,]
#Train model
sptlnb_base <- glm.nb(ncve_relax ~ population
capdist
month_year,
data = sptllearningSet,
control = glm.control(maxit = 3000))
sptlnb_lit <- glm.nb(ncve_relax ~ population
capdist
multidim.poverty
eth_frc_t13
eth_plr_t13
sp_lag_relax
ncve_relax_lag
month_year,
data = sptllearningSet,
control = glm.control(maxit = 3000))
sptlnb_core <- glm.nb(ncve_relax ~ population
capdist
multidim.poverty
eth_frc_t13
eth_plr_t13
sp_lag_relax
ncve_relax_lag
no_troops
unpol.dummy
area
ruggedness
month_year,
data = sptllearningSet,
control = glm.control(maxit = 3000))
#Use coefficients to predict on test
mydata$nbpred.core[mydata$prefecture == i] = as.numeric(predict(sptlnb_core, newdata = mydata[mydata$prefecture == i,], type='response'))
mydata$nbpred.lit[mydata$prefecture == i] = as.numeric(predict(sptlnb_lit, newdata = mydata[mydata$prefecture == i,], type='response'))
mydata$nbpred.base[mydata$prefecture == i] = as.numeric(predict(sptlnb_base, newdata = mydata[mydata$prefecture == i,], type='response'))
}
}
Спасибо вам за помощь!
РЕДАКТИРОВАТЬ: я добавил начальную часть своего кода, чтобы убедиться, что он полностью воспроизводим.
Комментарии:
1. Можете ли вы предоставить примерный набор данных, чтобы мы могли оказать лучшую помощь?
2. Рассматривали ли вы какую-либо версию
pmap
функций? Например, они могут присваивать каждое значение цикла строке в фрейме данных. Тогда вы могли бы объединить их вместе.3. @BrianFisher готово. Извините за это. Следовало сделать это сразу.
4. @CareyCaginalp у меня нет. Как это будет работать в этом случае? Я никогда не использовал функции pmap или пакет purrr.
Ответ №1:
Вы имеете дело с проблемой определения области действия, когда вы запускаете цикл for внутри функции, прогнозы назначаются внутри функции, но не влияют на глобальную среду, в которой доступен фрейм данных.
Самый простой способ справиться с этим — просто вытащить цикл for из функции — удалить вызов runPredictions <- function(){}
, и он должен работать нормально. В качестве альтернативы, вы можете принудительно назначить функцию глобальной среде или применить отдельные функции к префектурам (например, с помощью pmap)
Комментарии:
1. Большое вам спасибо @BrianFisher. Это решило проблему.