【问题标题】:Regression model with all possible two way interaction terms in rr 中所有可能的双向交互项的回归模型
【发布时间】:2020-02-14 13:57:46
【问题描述】:

我有一个包含 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 ~", factor) : 无法将类型“闭包”强制转换为“字符”类型的向量

这是我的数据集:

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

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

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。数据图片没有帮助,因为我们无法将它们复制/粘贴到 R 中。
  • 试试 as.formula() 并将它包裹在你的 paste() 函数中。
  • @Mat 再次弹出同样的错误
  • 我认为双向交互是 "var1:var2" 而如果你做 "var1*var2" 你会得到双向交互 "var1 + var2 + var1:var2"
  • @MrFlick 我可以包含一个显示我想要的实际结果的输出

标签: r regression


【解决方案1】:

您的问题是 if 语句的结尾。这段代码应该可以工作:

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(paste0("return ~", factor), data=dt)
      print(summary(lm.fit))
    }
  }
}

问题在于,对于第一次迭代,变量因子没有定义。也尽量不要命名变量因子,因为因子是 R 中的一个函数。

【讨论】:

    【解决方案2】:

    我认为这应该可以让你摆脱循环:

    lm.fit = lm(return ~ (.)^2, data=dt)

    【讨论】:

    • 我认为这是基于标题,但似乎 OP 想要单独拟合模型,一次只使用一个交互项。
    【解决方案3】:

    下面的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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2020-04-08
      • 1970-01-01
      相关资源
      最近更新 更多