想要用'重新编写循环回归的想法。循环

时间:2014-04-01 16:33:22

标签: r regression

我有一个大脑冻结,并希望你们中的一个能指出我正确的方向。我的最终目标是各种回归系数的输出(主要是对价格弹性感兴趣),我通过简单的多元回归实现,使用" by"功能。

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

通过结合我现有的" by"有效地重写这个的最佳方法是什么?回归函数," for"循环,所以我可以绕过不断更改数据框名称的步骤" datastep3"和#34; 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)

1 个答案:

答案 0 :(得分: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)

还有很多其他的东西可以改进,但没有数据集,尝试就没有意义。