【问题标题】:Create regression coefficient table创建回归系数表
【发布时间】:2014-04-21 20:33:54
【问题描述】:

我总共有 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

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

从上面可以看出,我不太清楚如何将变量添加到数据框tmp

【问题讨论】:

    标签: r for-loop dataframe regression


    【解决方案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,因为它是一个数据框,但您可以使用相应的名称。此外,我们将结果数据框初始化为正确的行数大小。

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

    【讨论】:

    • 我正在研究矩阵法。
    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多