【问题标题】:For Loop for Regression based on variable name in R基于R中变量名的For循环进行回归
【发布时间】:2015-06-09 15:39:48
【问题描述】:

我目前正在对一个数据集进行一系列回归,该数据集包含 72,000 个观测值,每个观测值大约有 20 个变量。其中一个变量由 56 个名称组成,我想对每个名称进行回归。我想我会为此创建一个 for 循环,但是我对处理这种大小的数据集有点缺乏经验。
包含名称的变量不在回归中。 NAME : 变量我想运行一个 for 循环来为每个名称运行回归。

我的代码:

 my.mods = lapply(s.dat, FUN = function(x) {
 lm(log(TM+1000) ~ log(Inc+1) + log(Slip_sq_K+1) +
log(Ten+1) + log(HF+1) + log(BroP+1) + log(B+1) +
log(sian+1) + log(H_+1) + log(C_65+1) + log(D+1) +
log(TIP+1) + log(p+1) + log(X34itP+1) + log(FGK+1) +
log(X19tP+1) + log(X2nitP+1) + log(Car_AloneP+1) +
log(CaoledP+1) +log(PTsP+1) + log(Gy+1) +
log(OthemeansP+1) + log(HP+1) + log(Coi+1) +
log(electr) + log(Na+1),
data = x, na.action=na.exclude)

} )

谢谢!

【问题讨论】:

    标签: r for-loop regression


    【解决方案1】:

    不需要循环。只需拆分您的数据并使用lapply

    acs.dat.split = split(acs.dat, acs.dat$NAME)
    
    my.mods = lapply(acs.dat, FUN = function(x) {
      lm(log(TSM+1000) ~ log(Inc+1) + log(Slip_sq_K+1) +
        log(Teen+1) + log(HFGG+1) + log(BrownP+1) + log(BlackP+1) +
        log(AsianP+1) + log(H_65+1) + log(C_65+1) + log(Detachedp+1) +
        log(TIP+1) + log(X2Unitp+1) + log(X34UnitP+1) + log(FGK+1) +
        log(X189tP+1) + log(X20PlusUnitP+1) + log(Car_AloneP+1) +
        log(CarpooledP+1) +log(PublicTransP+1) + log(Gly+1) +
        log(OthermeansP+1) + log(HomeP+1) + log(CommTime+1) +
        log(electr) + log(Natural_gas+1),
        data = x, na.action=na.exclude)
      } 
    )
    

    【讨论】:

      【解决方案2】:

      如果你想使用循环,你可以对每个名称的数据进行子集化:

      data(mtcars)
      models = list()
      for (i in 1:length(unique(row.names(mtcars)))) {
        sub_cars <- subset(x = mtcars, subset = row.names(mtcars) == row.names(mtcars)[i])
        models[i] <- lm(mpg ~ cyl, data = sub_cars)
      }
      

      【讨论】:

        【解决方案3】:

        这是我在裸 R 中的解决方案,只是有点长,因为我生成了一个代码,因为我不确定我是否得到你想要的。但我想如果我明白了,你可以使用最后一行。

            # Random code for example
            set.seed(1)
            names <- c("Homer", "Bart", "Lisa")
            da <- rnorm(30)
            da1 <- rnorm(30, 2)
            data <- data.frame(Names = rep(names, 10), da, da1)
        

        我相信你可以在这里使用:

        reg <- by(data[, 2:3], data$Names, lm)
        

        他在这里输出:

        reg
        data$Names: Bart
        
        Call:
        FUN(formula = data[x, , drop = FALSE])
        
        Coefficients:
        (Intercept)          da1  
             0.7738      -0.3076  
        
        -------------------------------------------------------------- 
        data$Names: Homer
        
        Call:
        FUN(formula = data[x, , drop = FALSE])
        
        Coefficients:
        (Intercept)          da1  
            0.14672     -0.01079  
        
        -------------------------------------------------------------- 
        data$Names: Lisa
        
        Call:
        FUN(formula = data[x, , drop = FALSE])
        
        Coefficients:
        (Intercept)          da1  
            -1.3974       0.7396  
        

        【讨论】:

          【解决方案4】:

          如果可能的话,我更喜欢在没有循环的情况下工作,我发现this 页面真的很有帮助。它展示了如何在 plyr 函数中使用模型并从中获取包含所有重要参数的表格。

          【讨论】:

            猜你喜欢
            • 2021-12-26
            • 2019-05-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-11
            • 1970-01-01
            • 2018-11-18
            • 1970-01-01
            相关资源
            最近更新 更多