首页 > 解决方案 > r 中所有可能的双向交互项的回归模型

问题描述

我有一个包含 8 个变量的数据集。我需要所有可能的双向交互项以及每个模型中的七个预测变量。因此,在我的例子中,总共将有 7C2 = 21 个模型,每个模型一次包含 7 个预测变量和一个双向交互项。

我尝试使用 for 循环生成 21 个模型,但是当我尝试在 for 循环中使用 lm() 函数时,代码似乎失败了。在我的问题中,返回的是我数据第 5 列的响应变量。

colnames(dt) = c("assets","turnover_ratio","SD","sharpe_ratio","return",
                 "expense_ratio","fund_dummy","risk_dummy")
vars=colnames(dt)[-5] 
for (i in vars)  {
  for (j in vars) {
    if (i != j) {
      factor= paste(i,j,sep='*')}
    lm.fit <- lm(paste("return ~", factor), data=dt)
    print(summary(lm.fit))
  }}

下面给出了代码的错误消息:

粘贴错误(“return ~”,因子):无法将“闭包”类型强制转换为“字符”类型的向量

这是我的数据集: 数据集

下面的输出应该是所需的输出,并且需要另外 20 个这样的模型以及其他可能的双向交互项。每个模型中都应存在所有 7 个预测变量。唯一应该改变的是双向交互项。

这是我所需的 21 个输出中的理想输出: 21 个所需输出中的一个所需输出

标签: rregression

解决方案


以下apply循环获取 7 个变量之间的所有成对交互。21 对首先是用 获得的combn

vars <- colnames(dt)[-5] 
resp <- colnames(dt)[5] 

cmb <- combn(vars, 2)

lm_list <- apply(cmb, 2, function(regrs){
  inter_regrs <- paste(regrs, collapse = "*")
  other_regrs <- setdiff(vars, regrs)
  all_regrs <- paste(other_regrs, collapse = "+")
  all_regrs <- paste(all_regrs, inter_regrs, sep = "+")
  fmla <- as.formula(paste(resp, all_regrs, sep = "~"))
  lm(fmla, data = dt)
})

lapply(lm_list, summary)

数据创建代码。

set.seed(1234)
dt <- replicate(8, rnorm(100))
dt <- as.data.frame(dt)

colnames(dt) <- c("assets","turnover_ratio","SD",
              "sharpe_ratio","return","expense_ratio",
              "fund_dummy","risk_dummy")

推荐阅读