Регрессия с фиктивной переменной, удалить фиктивный перехват, сохранив только условия взаимодействия

Я пытаюсь запустить регрессию с фиктивной переменной, которая принимает значение 0 до 2009 года и 1 после 2009 года, чтобы увидеть влияние финансового кризиса.

Я делаю это, добавляя дополнительный столбец под названием «фиктивный» со значениями, как указано выше, а затем добавляю фиктивную переменную в регрессию. Однако меня не интересует «фиктивный перехват», а только фиктивные термины взаимодействия. Тем не менее следующая регрессия дает фиктивный термин перехвата, который я явно не включаю. Можете ли вы помочь мне понять, как исключить его из регрессии?

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"  

Любые предложения о том, как удалить перехват "манекен"?


person Karl Wig    schedule 05.05.2020    source источник


Ответы (1)


Большинство объектов lm или glm понимают * в формуле как полное взаимодействие. Поэтому, когда вы добавляете его туда, lmList понимает dummy*(a + b), поскольку вы запрашиваете следующие ковариаты: фиктивный, a, b, фиктивный: a, фиктивный: b. Вместо этого создайте переменную, определенную как newvar = dummy*(a+b), и передайте ее в регрессию. Таким образом, на самом деле добавление lag1, lag2 и Interest_rate в ваш lmList является излишним, потому что вы запрашиваете их с *. Чтобы проиллюстрировать разницу:

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.

person doubled    schedule 05.05.2020
comment
Большое спасибо, и особенно за то, что вы четко объяснили свое решение. - person Karl Wig; 07.05.2020
comment
@КарлВиг, конечно. не стесняйтесь принять ответ, чтобы он не остался без ответа! - person doubled; 07.05.2020