![](/img/trans.png)
[英]How to include all possible two-way interaction terms in a linear model in R?
[英]Regression model with all possible two way interaction terms in r
我有一個包含 8 個變量的數據集。 我需要所有可能的雙向交互項以及每個 model 中的七個預測變量。 因此,在我的例子中,總共將有 7C2 = 21 個模型,每個模型一次包含 7 個預測變量和一個雙向交互項。
我嘗試使用 for 循環生成 21 個模型,但是當我嘗試在 for 循環中使用該代碼時,代碼似乎在 lm() function 處失敗。 在我的問題中,返回的是我數據第 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 ~”,因子):無法將“閉包”類型強制轉換為“字符”類型的向量
這是我的數據集:
下面的 output 應該是所需的 output 並且需要另外 20 個這樣的模型以及其他可能的雙向交互項。 每個 model 中都應存在所有 7 個預測變量。 唯一應該改變的是雙向交互項。
這是所需的 21 個中我想要的 output:
您的問題是 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 中的 function。
以下apply
循環獲取 7 個變量之間的所有成對交互。 首先使用combn
獲得 21 對。
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")
我認為這應該可以讓你擺脫循環:
lm.fit = lm(return ~ (.)^2, data=dt)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.