创建回归系数表

时间:2014-04-21 20:33:55

标签: r for-loop dataframe regression

我总共有46个回归模型,我想在数据表中总结一下。这是我创建的一个虚拟示例,用于帮助解释我的方法论。

#Dummy data
Data1 <- data.frame(flow = c(8,8.5,6,7.1,9), SP_elev = c(20,11,5,25,50))
Data2 <- data.frame(flow = c(7,7.2,6.5,8.2,8.5), SP_elev = c(13,15,18,25,19))
Data3 <- data.frame(flow = c(2,3,5,7,9), SP_elev = c(20,25,28,30,35))
Data4 <- data.frame(flow = c(1,4,6,8,9), SP_elev = c(13,15,18,25,19))
Data5 <- data.frame(flow = c(1,4,6,8,9), SP_elev = c(13,15,18,25,19))
Data6 <- data.frame(flow = c(1,4,6,8,9), SP_elev = c(22,23,25,27,29))

#Create blank data frame with desired column names  
tmp <- data.frame(matrix(nrow=0, ncol=9))
names(tmp) <- c("site_name","int", "coflin", "cofsqd", "fstat", "ldf", "udf", "cod", "pval")

#Create Vector list 
dataframes = list("Data1" = Data1, 
                  "Data2" = Data2, 
                  "Data3" = Data3,
                  "Data4" = Data4,
                  "Data5" = Data5,
                  "Data6" = Data6) 

#plot a with regression model
for (i in dataframes) {

#Create regression model
fit2<-lm(SP_elev ~ flow + I(flow^2), data=i) 
pol2 <- function(x) fit2$coefficient[3]*x^2 + fit2$coefficient[2]*x + fit2$coefficient[1] 

#Create variables for each coefficient
site_name <- i
int <- signif(summary(fit2)$coefficients[1],4)
coflin <- signif(summary(fit2)$coefficients[2],4)
cofsqd <- signif(summary(fit2)$coefficients[3],4)
fstat <- signif(summary(fit2)$fstatistic,4)
ldf <- signif(summary(fit2)$fstatistic[2],2)
udf <- signif(summary(fit2)$fstatistic[3],2)
cod <- signif(summary(fit2)$adj.r.squared,3)
pval <- signif(pf(fstat,ldf,udf,lower.tail=FALSE),4

#add variables to the dataframe 'tmp'

}

目前我的方法是:

  1. 输入虚拟数据
  2. 创建空白数据框
  3. 创建虚拟数据的矢量列表
  4. 运行for循环以对每个数据集执行回归分析。

    一个。格式化相应的变量以添加到数据框tmp

    湾将格式化的变量逐行附加到数据框tmp(i 每个虚拟数据集的行)

  5. 如上所示,我不太清楚如何将变量添加到数据框tmp

1 个答案:

答案 0 :(得分:1)

如果将循环更改为计数器而不是实际的数据框对象,则这变得非常简单:

tmp <- data.frame(matrix(nrow=length(dataframes), ncol=9))
names(tmp) <- c("site_name","int", "coflin", "cofsqd", "fstat", "ldf", "udf", "cod", "pval")
for(j in seq_along(dataframes)) {
  i <- dataframes[[j]]

  # rest of your code goes here

  new.row <- c(names(dataframes)[[j]], int, coflin, ..., cod, pval)
  tmp[j, ] <- new.row
}

请注意您如何使用i作为ID,因为这是一个数据框,但您可以使用相应的名称。此外,我们将结果数据框初始化为行数的正确大小。

需要注意的一点是,修改数据帧的速度很慢,因此您通常不希望在循环中执行此操作,除非您的循环没有多次迭代。如果是这样,一个简单的解决方案是首先使用矩阵,并在完成循环后将其转换为数据帧。