值为0时,线性模型出错

时间:2015-02-26 21:43:29

标签: r error-handling lm

我有一个名称,值为1和值为2的数据集。我需要运行回归并获取每个名称的t统计量。我在构建线性模型时得到了StackOverflow的帮助。我注意到有时我得到的数据是0。没关系,我希望模型继续运行而不是炸弹。然而,当0在那里时,线性模型就会爆炸。

    v1<-rnorm(1:50)
    v2<-rnorm(1:50)
    data<-data.frame(v1,v2)
    data[1:50,"nm"]<-"A"
    data[50:100,"nm"]<-"B"
    data[50:100,"v1"]<-0
    data[50:100,"v2"]<-0
    data<-data[c("nm","v1","v2")]

    ## run regression and generate universe
    plyrFunc <- function(x){
      mod <- lm(v1~v2, data = x)
      return(summary(mod)$coefficients[2,3])
    }

    lm <- ddply(data, .(nm), plyrFunc)

正如你所看到的,对于名字B,因为一切都是0,模型就会爆炸。我不能只删除所有0,因为这些值通常都是0。

我不知道如何编辑上面的代码以便它继续运行。

任何人都可以告诉我吗?谢谢!

1 个答案:

答案 0 :(得分:1)

该模型实际上工作正常,它是summary(mod)$coefficients的子集,它会引发错误,因为它在全零的情况下只包含一行:

> summary(lm(v1~v2,data[data$nm=="A",]))$coefficients
              Estimate Std. Error    t value  Pr(>|t|)
(Intercept) -0.1462766  0.1591779 -0.9189503 0.3628138
v2          -0.1315238  0.1465024 -0.8977590 0.3738900

> summary(lm(v1~v2,data[data$nm=="B",]))$coefficients
            Estimate Std. Error t value Pr(>|t|)
(Intercept)        0          0     NaN      NaN

因此,您需要修改您的功能以考虑这种情况:

plyrFunc <- function(x){
  mod <- lm(v1~v2, data = x)
  res <- summary(mod)$coefficients
  if (nrow(res)>1) res[2,3] else NA
}

library(plyr)
result <- ddply(data, .(nm), plyrFunc)

样本数据集的输出:

  nm         V1
1  A -0.1825896
2  B         NA