Проект R: цикл прерывается после того, как lm выдает ошибку

#r #for-loop #lm

#r #для цикла #lm

Вопрос:

Я хочу автоматически запускать линейные регрессии и сохранять результаты. Бета-коэффициенты, сгенерированные проектом R, позже будут использоваться в качестве параметров для дальнейших вычислений.

Это пример моего расположения данных:

  id |x_2000|x_2001|x_2002|y_2000|y_2001|y_2002|z_2000|z_2001|z_2002
 1  |20   |NA     |6     |90    |NA    |80    |54    |NA    |10
 2  |50   |NA     |10    |50    |NA    |50    |60    |NA    |40
 3  |4    |NA     |1     |5     |NA    |10    |30    |NA    |120
  

x — это значение x, а число за ним представляет год. Та же логика применима к другим переменным y и z.

Для запуска линейных регрессий я создал цикл. Я использую следующий код для перебора переменных и запуска регрессии для каждого года.

 for (i in 2000:2002){
  X_COLUMN <- c(paste0("x_",i))
  Y_COLUMN <- c(paste0("y_",i))
  Z_COLUMN <- c(paste0("z_",i))
  result.lm <- lm(as.formula(paste("formula=",X_COLUMN,"~",Y_COLUMN," ",Z_COLUMN,"-1")), data=data_for_regression)
  b1 <- rbind(b1, c(x,i,coef(result.lm)[1]))
  b2 <- rbind(b2, c(x,i,coef(result.lm)[2]))
  }
  

Для 2000 года все работает хорошо, однако, когда цикл продолжается до 2001 года, он достигает значений NA. Это приводит к сообщению об ошибке:

Ошибка в lm.fit(x, y, offset = смещение, единственное число.ok = singular.ok, …): 0 (не NA) случаев

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

Есть идеи, как это исправить?

Ответ №1:

Как насчет использования try инструкции

 for (i in 2000:2002){
    X_COLUMN <- c(paste0("x_",i))
    Y_COLUMN <- c(paste0("y_",i))
    Z_COLUMN <- c(paste0("z_",i))
    try({
        result.lm <- lm(as.formula(paste("formula=",X_COLUMN,"~",Y_COLUMN," ",Z_COLUMN,"-1")), data=data_for_regression)
        b1 <- rbind(b1, c(x,i,coef(result.lm)[1]))
        b2 <- rbind(b2, c(x,i,coef(result.lm)[2]))
    }, silent=T)
}
  

или tryCatch

 for (i in 2000:2002){
    X_COLUMN <- c(paste0("x_",i))
    Y_COLUMN <- c(paste0("y_",i))
    Z_COLUMN <- c(paste0("z_",i))
    tryCatch({
        result.lm <- lm(as.formula(paste("formula=",X_COLUMN,"~",Y_COLUMN," ",Z_COLUMN,"-1")), data=data_for_regression)
        b1 <- rbind(b1, c(x,i,coef(result.lm)[1]))
        b2 <- rbind(b2, c(x,i,coef(result.lm)[2]))
    }, error=function(e) {
        b1 <- rbind(b1, c(x,i,NA))
        b2 <- rbind(b2, c(x,i,NA))
    })
}
  

Комментарии:

1. tryCatch это правильный путь, но, пожалуйста, не поощряйте вопиющие нарушения R-inferno! (Предоставьте «лучший» способ, а не просто выдумку для ответа на конкретный вопрос)

2. @MrFlick Я попробую.

3. @MrFlick Я продолжаю получать ошибку с ‘}’. Не уверен, но я могу иметь какое-то отношение к ‘tryCatch ({‘, закрытия нет ‘)’.

4. Да, мне не хватало пары. Я думаю, что это исправлено.