R项目:lm给出错误后循环中断

时间:2014-06-30 23:23:05

标签: r for-loop 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 = offset,singular.ok = singular.ok,...):   0(非NA)案件

逻辑,因为2001年没有完整的案例。结果是循环中断了。但是,我不希望它打破,但要继续到明年。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

如何使用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))
    })
}