我有一个名称,值为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。
我不知道如何编辑上面的代码以便它继续运行。
任何人都可以告诉我吗?谢谢!
答案 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