虚拟变量回归,删除虚拟截距,仅保留交互项
Dummy variable regression, remove dummy intercept keeping only interaction terms
我尝试 运行 一个虚拟变量的回归,该虚拟变量在 2009 年之前取值为 0,从 2009 年起取值为 1,以了解金融危机的影响。
我通过添加一个名为 "dummy" 的额外列来实现这一点,该列具有上述值,然后将虚拟变量添加到回归中。但是,我对 "dummy intercept" 不感兴趣,只对虚拟交互项感兴趣。下面的回归仍然产生了一个虚拟截距项,我没有明确包括在内。你能帮我理解如何将它从回归中排除吗?
library(lme4)
library(dplyr)
#TEST##
merged_income_test <- merged_income %>%
mutate(dummy = case_when(
year > 2008 ~ 1,
year < 2009 ~ 0
))
regression_merged_income_test <-
lmList(income_rate ~ interest_rate + lag1 + lag2 +
dummy * (interest_rate + lag1 + lag2) | firm,
merged_income_test,
pool = FALSE )
regression_merged_income_test_results <- coef(regression_merged_income_test)
colnames(regression_merged_income_test_results)
[1] "(Intercept)" "interest_rate" "lag1" "lag2" "dummy" "interest_rate:dummy"
[7] "lag1:dummy" "lag2:dummy"
关于如何删除拦截的任何建议"dummy"?
大多数 lm
或 glm
对象在公式中理解 *
表示完全交互。因此,当您将它添加到此处时,lmList 理解 dummy*(a + b)
,因为您要求以下协变量:dummy,a,b,dummy:a,dummy:b。相反,创建一个定义为 newvar = dummy*(a+b) 的变量,并将其传递到回归中。所以实际上在你的 lmList 中添加 lag1、lag2 和 interest_rate 是多余的,因为你用 * 请求它们。为了说明差异:
require(lme4)
require(data.table)
df = data.table("income_rate" = rnorm(500),
"dummy" = rbinom(500, size = 1,prob = .5),
"interest_rate" = rnorm(500),
"firm" = rbinom(500, size =1 ,prob =.3),
"rand" = rbinom(500, size =1 , prob = .2))
df[, new_var := interest_rate*dummy]
lmList(income_rate ~ interest_rate*dummy | firm, df)
Call: lmList(formula = income_rate ~ interest_rate * dummy | firm, data = df)
Coefficients:
(Intercept) interest_rate dummy interest_rate:dummy
0 0.06110581 -0.005786927 -0.0873395 -0.06646967
1 -0.09507628 0.219900191 0.1439778 -0.20570454
lmList(income_rate ~ new_var | firm, df)
Call: lmList(formula = income_rate ~ new_var | firm, data = df)
Coefficients:
(Intercept) new_var
0 0.01645925 -0.07697772
1 -0.01323612 0.02462004
因此创建您真正想要包含的变量并将它们传递给 lmList
应该很容易。
我尝试 运行 一个虚拟变量的回归,该虚拟变量在 2009 年之前取值为 0,从 2009 年起取值为 1,以了解金融危机的影响。
我通过添加一个名为 "dummy" 的额外列来实现这一点,该列具有上述值,然后将虚拟变量添加到回归中。但是,我对 "dummy intercept" 不感兴趣,只对虚拟交互项感兴趣。下面的回归仍然产生了一个虚拟截距项,我没有明确包括在内。你能帮我理解如何将它从回归中排除吗?
library(lme4)
library(dplyr)
#TEST##
merged_income_test <- merged_income %>%
mutate(dummy = case_when(
year > 2008 ~ 1,
year < 2009 ~ 0
))
regression_merged_income_test <-
lmList(income_rate ~ interest_rate + lag1 + lag2 +
dummy * (interest_rate + lag1 + lag2) | firm,
merged_income_test,
pool = FALSE )
regression_merged_income_test_results <- coef(regression_merged_income_test)
colnames(regression_merged_income_test_results)
[1] "(Intercept)" "interest_rate" "lag1" "lag2" "dummy" "interest_rate:dummy"
[7] "lag1:dummy" "lag2:dummy"
关于如何删除拦截的任何建议"dummy"?
大多数 lm
或 glm
对象在公式中理解 *
表示完全交互。因此,当您将它添加到此处时,lmList 理解 dummy*(a + b)
,因为您要求以下协变量:dummy,a,b,dummy:a,dummy:b。相反,创建一个定义为 newvar = dummy*(a+b) 的变量,并将其传递到回归中。所以实际上在你的 lmList 中添加 lag1、lag2 和 interest_rate 是多余的,因为你用 * 请求它们。为了说明差异:
require(lme4)
require(data.table)
df = data.table("income_rate" = rnorm(500),
"dummy" = rbinom(500, size = 1,prob = .5),
"interest_rate" = rnorm(500),
"firm" = rbinom(500, size =1 ,prob =.3),
"rand" = rbinom(500, size =1 , prob = .2))
df[, new_var := interest_rate*dummy]
lmList(income_rate ~ interest_rate*dummy | firm, df)
Call: lmList(formula = income_rate ~ interest_rate * dummy | firm, data = df)
Coefficients:
(Intercept) interest_rate dummy interest_rate:dummy
0 0.06110581 -0.005786927 -0.0873395 -0.06646967
1 -0.09507628 0.219900191 0.1439778 -0.20570454
lmList(income_rate ~ new_var | firm, df)
Call: lmList(formula = income_rate ~ new_var | firm, data = df)
Coefficients:
(Intercept) new_var
0 0.01645925 -0.07697772
1 -0.01323612 0.02462004
因此创建您真正想要包含的变量并将它们传递给 lmList
应该很容易。