【问题标题】:Ideas to re-write looping regression with 'for' loops用“for”循环重写循环回归的想法
【发布时间】:2014-04-01 16:33:21
【问题描述】:

我的大脑有些僵硬,希望你们中的某个人能指出我正确的方向。我的最终目标是各种回归系数的输出(主要对价格弹性感兴趣),我使用“by”函数通过简单的多元回归实现了这一目标。

我正在使用“by”函数循环遍历“State.UPC”变量的每次迭代的回归公式。由于我的数据非常大(~1MM 行),我不得不将我的数据分成 3-4 个状态组(参见 mystates1...mystates10)。然后我对这些子集执行回归,每次都在“datastep3”数据框中更改我的数据源。这就是我需要你帮助的地方:

结合我现有的“by”回归函数和“for”循环,有效地重写它的最佳方法是什么,这样我就可以绕过在“datastep3”中不断更改数据框名称的步骤和“write.csv”步骤。本质上是 R 循环遍历每个“mystates”数据子集并通过“State.UPC”属性进行回归?

我尝试了几种组合都没有成功。请原谅这个业余问题...仍在学习 R。这是我的代码:

data <-read.csv("PriceData.csv")
datastep1 <-subset(data, subset=c(X..Vol>0, Unit.Vol>0))
datastep2 <- transform(datastep1, State.UPC = paste(State,UPC, sep="."))

mystates1 <- c("AL","AR","AZ")
mystates2 <- c("CA","CO","FL")
mystates3 <- c("GA","IA","IL")
mystates4 <- c("IN","KS","KY")
mystates5 <- c("LA","MI","MN")
mystates6 <- c("MO","MS","NC")
mystates7 <- c("NJ","NM","NV")
mystates8 <- c("NY","OH","OK")
mystates9 <- c("SC","TN","TX")
mystates10 <- c("UT","VA","WI","WV")


datastep3 <-subset(datastep2, subset=State %in% mystates10)
datastep4 <-na.omit(datastep3)


PEbyItem <- by(datastep4, datastep4$State.UPC, function(df) 
  lm(log(Unit.Vol)~log(Price) + Distribution+Independence.Day+Labor.Day+Memorial.Day+Thanksgiving+Christmas+New.Years+
   Year+Month, data=df))

x <- do.call("rbind",lapply(PEbyItem, coef))
y <-data.frame(x)


write.csv(x, file="mystates10.csv", row.names=TRUE)

【问题讨论】:

    标签: r regression


    【解决方案1】:

    无法对此进行测试,因为您不提供任何数据,但理论上您可以将各种 mystatesN 组合到一个列表中,然后在其上运行 lapply(...)

    ## Not tested...
    get.PEbyItem <- function(i) {
      datastep3 <-subset(datastep2, subset=State %in% mystates[[i]])
      datastep4 <-na.omit(datastep3)
      PEbyItem  <- by(datastep4, datastep4$State.UPC, function(df) 
        lm(log(Unit.Vol)~log(Price) + Distribution+Independence.Day+Labor.Day+
           Memorial.Day+Thanksgiving+Christmas+New.Years+Year+Month, 
           data=df))
      x <- do.call("rbind",lapply(PEbyItem, coef))
      y <-data.frame(x)
      write.csv(x, file=paste(names(mystates[i]),"csv",sep="."), row.names=TRUE)
    }
    
    mystates <- list(ms1=mystates1, ms2=mystates2, ..., ms10=mystates10)
    lapply(1:length(mystates),get.PEbyItem)
    

    还有很多其他可以改进的地方,但如果没有数据集,尝试毫无意义。

    【讨论】:

    • 这非常有效 - 非常感谢。以后会研究代码来充分理解和使用逻辑。
    • akakas - *apply 函数(apply、lapply、sapply、tapply 等)是 'idiomatic' R 的核心主力之一。通过学习它们,您可以获得更多回报。它们并非一定更快(在某些情况下,甚至可能比编写良好的循环慢一点),但它们使代码更紧凑、更易于理解/可维护。
    • 谢谢@Glen_b。我一定会努力让这些功能更加嵌入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2019-02-18
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多