Для цикла, не сохраняющего результаты в столбцах целевого фрейма данных

#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. Это решило проблему.