首页 > 解决方案 > 如何在 R、Excel/VBA 中对解释变量的所有不同组合的时间序列数据运行不同的多元线性回归?

问题描述

我是编码和 R 的新手,希望得到您的帮助。对于我的分析,我试图对具有 1 个因变量(Y)和 4 个自变量(X1、X2、X3、X4)的时间序列数据进行回归。所有这些变量(Y 和 X)都有 4 种不同的变换(例如,对于 X1 - X1、SQRT(X1)、Square(X1) 和 Ln(X1))。我想对 Y (Y, SQRT(Y), Square(Y), Ln(Y)) 的所有可能组合和 X 值的所有组合运行回归,以便最后我可以通过查看R 平方值在其转换中选择哪个变量。

我目前正在使用 R 中的代码进行线性回归并手动更改变量,这需要花费大量时间。也许有一个循环或我可以用于回归的东西?等待您的热心帮助。谢谢

lm(Y ~ X1 + X2 + X3 + X4)
lm(SQRT(Y) ~ X1 + X2 + X3 + X4)
lm(Square(Y) ~ X1 + X2 + X3 + X4)
lm(Ln(Y) ~ 1 + X2 + X3 + X4)

lm(Y ~ SQRT(X1) + X2 + X3 + X4)
lm(Y ~ Square(X1) + X2 + X3 + X4)
.... 
lm(ln(Y)~ ln(X1) + ln(X2) + ln(X3) + ln(X4))

这是我的原始代码。

Regression10 <- lm(Final_Data_v2$`10 KW Installations (MW)`~Final_Data_v2$`10 KW Prio Installations (MW)`+Final_Data_v2$`FiT 10 KW (Cent/kWh)`+Final_Data_v2$`Electricity Prices 10 kW Cent/kW`+Final_Data_v2$`PV System Price  (Eur/W)`)
summary(Regression10)
Regressionsqrt10 <- lm(Final_Data_v2$`SQRT(10 KW Installations (MW))`~Final_Data_v2$`10 KW Prio Installations (MW)`+Final_Data_v2$`FiT 10 KW (Cent/kWh)`+Final_Data_v2$`Electricity Prices 10 kW Cent/kW`+Final_Data_v2$`PV System Price  (Eur/W)`)
summary(Regressionsqrt10) 

等等..

这是我的数据的链接:链接

标签: rvbacombinationslinear-regression

解决方案


考虑expand.grid所有系数组合,使用 . 过滤每个列名grep。然后调用模型函数,该函数采用带有Map(wrapper to mapply) 的动态公式来构建lmN=1,024 项的对象列表(等于所有系数组合)。

下面运行平方根和平方的等效多项式运算。注意:grep仅需要对实际变量名称进行调整。

coeffs <- c(names(Final_Data_v2),
            paste0("I(", names(Final_Data_v2), "^(1/2))"),
            paste0("I(", names(Final_Data_v2), "^2)"),
            paste0("log(", names(Final_Data_v2), ")"))         

# BUILD DATA FRAME OF ALL COMBNS OF VARIABLE AND TRANSFORMATION TYPES
all_combns <- expand.grid(y_var = coeffs[grep("10 KW Installations (MW)", coeffs)],
                          x_var1 = coeffs[grep("10 KW Prio Installations (MW)", coeffs)],
                          x_var2 = coeffs[grep("FiT 10 KW (Cent/kWh)", coeffs)],
                          x_var3 = coeffs[grep("Electricity Prices 10 kW Cent/kW", coeffs)],
                          x_var4 = coeffs[grep("PV System Price  (Eur/W)", coeffs)],
                          stringsAsFactors = FALSE)

# FUNCTION WITH DYNAMIC FORMULA TO RECEIVE ALL POLYNOMIAL TYPES
proc_model <- function(y, x1, x2, x3, x4) {
     myformula <- paste0("`",y,"`~`",x1,"`+`",x2,"`+`",x3,"`+`",x4,"`")
     summary(lm(as.formula(myformula), data=Final_Data_v2))
}

# MAP CALL PASSING COLUMN VALUES ELEMENTWISE AS FUNCTION PARAMS
lm_list <- with(all_combns, Map(proc_model, y_var, x_var1, x_var2, x_var3, x_var4))

推荐阅读