存储R中几个回归的系数,然后将系数调用到第二个循环

时间:2018-05-17 13:34:25

标签: r linear-regression

我正在尝试从多个多线性回归中输出系数,存储每个系数,然后将系数乘以未来数据集以预测未来收入。

总共有91次回归。每个人都有一个' DBA'编号为0到90.这些是针对680个日期。

我有循环运行所有回归并输出系数。我需要帮助存储每个独特的91系数向量。

 x = 0
while(x<91) {
  pa.coef <- lm(formula = Final_Rev ~  OTB_Revenue + ADR + Sessions,data=subset(data, DBA == x))
  y <- coef(pa.coef)
  print(cbind(x,y))
  x = x + 1
}

在存储了每个唯一向量之后,我需要将向量乘以未来的日期&#39;输出预测收入。&#39;

非常感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:1)

由于您需要存储迭代中的数据,因此请考虑在forwhile等标准循环上使用 apply 函数。并且因为您需要按组进行子集,所以请考虑使用by(面向对象的包装器到tapply),它按因子对数据帧进行切片并将子集传递给函数。这样一个所需的功能会调用lmpredict.lm

下面演示随机数据 otherdata 数据帧(每个 DBA 组10行),以返回预测 Final_Rev的命名列表向量(根据 DBA 组,每个长度为10)。

数据

set.seed(51718)
data <- data.frame(DBA = rep(seq(0,90), 10),
                   Sessions = sample(100:200, 910, replace=TRUE),
                   ADR = abs(rnorm(910)) * 100,
                   OTB_Revenue = abs(rnorm(910)) * 1000,
                   Final_Rev = abs(rnorm(910)) * 1000)

set.seed(8888)
other_data <- data.frame(DBA = rep(seq(0,90), 10),
                         Sessions = sample(100:200, 910, replace=TRUE),
                         ADR = abs(rnorm(910)) * 100,
                         OTB_Revenue = abs(rnorm(910)) * 1000,
                         Final_Rev = abs(rnorm(910)) * 1000)

<强>预测

final_rev_predict_list <- by(data, data$DBA, function(sub){
  pa.model <- lm(formula = Final_Rev ~  OTB_Revenue + ADR + Sessions, data=sub)

  predict.lm(pa.model, new_data=other_data)      
})

final_rev_predict_list[['0']]
#         1        92       183       274       365       456       547       638       729       820 
#  831.3382 1108.0749 1404.8833 1024.4387  784.5980  455.0259  536.9992  100.5486  575.0234  492.1356

final_rev_predict_list[['45']]
#        46       137       228       319       410       501       592       683       774       865 
# 1168.1625  961.9151  536.2392 1125.5452 1440.8600 1008.1956  609.7389  728.3272 1474.5348  700.1708 

final_rev_predict_list[['90']]
#       91      182      273      364      455      546      637      728      819      910 
# 749.9693 726.6120 488.7858 830.1254 659.7508 618.7387 929.6969 584.3375 628.9795 929.3194