Проект 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
х это значение х, а число за ним представляет год. Та же логика применима и к другим переменным 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 = offset, singular.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))
})
}