r - 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 个输出中的理想输出:
解决方案
以下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")
推荐阅读
- performance - 使用 UnboxedSums 定义的总和类型是否比普通枚举更有效?
- javascript - JSON 扩展而不覆盖具有相同名称的属性
- mysql - 如何在同一个 MySQL 命令中将日期字段格式化为不同的语言?
- php - PHP中基于键值循环遍历三个独立的std类对象数组
- ios - 如何以编程方式设置滚动视图高度
- c# - ASP.Net Identity 内置函数与 ASP.Net Core 中的自定义表
- html - 发出占位符自动建议
- javascript - 将 Typescript 类型声明添加到 Monaco 编辑器
- java - MySQL 对简单 INSERT 操作“=”的排序规则的非法混合
- angular - Xsrf 令牌与 Jwt 令牌冲突