14  상호작용 (Interaction)

경고작업 진행 중 🚧

여러분은 현재 작성 중인 R을 이용한 인과 추론의 초판본을 읽고 계십니다. 이 장은 활발히 작업 중이며 구조가 변경되거나 수정될 수 있습니다. 또한 내용이 불완전할 수 있습니다.

인과 추론에서 상호작용(interaction)은 한 변수의 효과가 다른 변수 값에 따라 달라지는 현상을 뜻합니다. 예를 들어 아침 엑스트라 매직 아워(Extra Magic Morning)가 대기 시간에 미치는 효과는 티켓 시즌에 따라 다를 수 있습니다. 성수기에는 효과가 더 크고 비수기에는 작을 수 있기 때문입니다. 이처럼 상호작용은 ’효과 수정(effect modification)’이라고도 하며, 인과 추론에서 매우 중요한 개념입니다.

14.1 함수 형태, 이질적 효과, 그리고 공동 원인 (Functional form, heterogeneous effects, and joint causes)

인과 효과는 모집단 전체에서 균일하지 않을 때가 많습니다. 이처럼 개인마다 다르게 나타나는 효과를 이질적 처치 효과(heterogeneous treatment effects, HTE)라고 합니다. 이질적 효과를 탐색하면 단순한 통계 개념을 넘어 “누구에게 개입 효과가 더 큰가?”라는 실용적인 질문에 답할 수 있습니다.

14.1.1 함수 형태 (Functional form)

선형 회귀 모델을 적합할 때, 예측 변수와 결과의 관계가 기본적으로 선형(linear)이라고 가정합니다. 하지만 현실에서의 관계는 비선형적일 때가 많습니다. 예를 들어 공원 기온이 올라갈수록 대기 시간이 늘어나지만, 그 증가 폭이 점차 커지거나 일정 수준에서 멈출 수 있습니다.

함수 형태를 잘못 설정하면 추정치에 편향이 생길 수 있습니다. 이를 해결하기 위해 다항식 항(polynomial terms), 스플라인(splines) 또는 기타 비선형 변환을 활용합니다.

library(broom)
library(touringplans)
library(splines)

seven_dwarfs_9 <- seven_dwarfs_train_2018 |>
  filter(wait_hour == 9)

# 선형 모델
fit_linear <- lm(
  wait_minutes_posted_avg ~ park_temperature_high,
  data = seven_dwarfs_9
)

# 비선형 모델 (3차 자연 스플라인)
fit_spline <- lm(
  wait_minutes_posted_avg ~ ns(park_temperature_high, df = 3),
  data = seven_dwarfs_9
)

# 두 모델 비교
tidy(fit_linear)
# A tibble: 2 × 5
  term            estimate std.error statistic  p.value
  <chr>              <dbl>     <dbl>     <dbl>    <dbl>
1 (Intercept)       97.9       8.62      11.4  1.09e-25
2 park_temperatu…   -0.351     0.104     -3.36 8.64e- 4
tidy(fit_spline)
# A tibble: 4 × 5
  term            estimate std.error statistic  p.value
  <chr>              <dbl>     <dbl>     <dbl>    <dbl>
1 (Intercept)       58.8        5.96     9.86  2.15e-20
2 ns(park_temper…   -0.771      4.05    -0.191 8.49e- 1
3 ns(park_temper…   26.7       13.9      1.92  5.51e- 2
4 ns(park_temper…  -14.1        3.57    -3.96  8.99e- 5

14.1.2 이질적 처치 효과 (Heterogeneous treatment effects)

이질적 처치 효과가 나타나면 평균 처치 효과(ATE)뿐만 아니라 특정 하위 집단의 효과에도 주목하게 됩니다. 이를 조건부 평균 처치 효과(Conditional Average Treatment Effect, CATE)라고 합니다.

\[\text{CATE}(x) = E[Y(1) - Y(0) \mid X = x]\]

예를 들어 티켓 시즌에 따라 엑스트라 매직 아워의 효과가 어떻게 달라지는지 살펴보겠습니다.

# 티켓 시즌별 하위 집단에서의 효과 탐색
library(dplyr)

seven_dwarfs_9 |>
  group_by(park_ticket_season) |>
  summarize(
    mean_wait_emm = mean(wait_minutes_posted_avg[park_extra_magic_morning == 1], na.rm = TRUE),
    mean_wait_no_emm = mean(wait_minutes_posted_avg[park_extra_magic_morning == 0], na.rm = TRUE),
    n_emm = sum(park_extra_magic_morning == 1),
    n_no_emm = sum(park_extra_magic_morning == 0)
  ) |>
  mutate(diff = mean_wait_emm - mean_wait_no_emm)
# A tibble: 3 × 6
  park_ticket_season mean_wait_emm mean_wait_no_emm
  <chr>                      <dbl>            <dbl>
1 peak                        97.7             78.2
2 regular                     65.1             66.2
3 value                       65.2             63.5
# ℹ 3 more variables: n_emm <int>, n_no_emm <int>,
#   diff <dbl>

이 단순 비교는 교란 요인을 통제하지 않으므로 인과적으로 해석할 때 주의해야 합니다.

14.1.3 공동 원인 (Joint causes)

두 변수가 동시에 결과를 유발하면 이를 공동 원인(joint causes)이라고 합니다. DAG에서는 두 노출 변수 모두 결과로 향하는 화살표를 가진 형태로 나타납니다. 공동 원인 그 자체는 상호작용이 아닙니다. 두 변수의 효과가 단순히 합산될 수 있기 때문입니다. 상호작용은 한 변수의 효과 크기가 다른 변수에 의해 수정(modified)될 때 일어납니다.

노트상호작용 vs. 교란 (Interaction vs. Confounding)

상호작용과 교란을 혼동하지 않도록 주의하세요.

  • 교란(confounding): 공통 원인이 노출과 결과 사이에 가공의 연관성을 만드는 것
  • 상호작용(interaction): 한 변수가 다른 변수의 효과 크기를 변화시키는 것

교란은 편향의 원인이며, 상호작용은 인과 구조의 고유한 특성입니다.

14.2 인과 모델에서 상호작용 항 적합하기 (Fitting interaction terms in causal models)

상호작용은 보통 두 변수의 곱(product)을 모델에 포함해 분석합니다. R에서는 * 연산자를 사용해 주효과(main effects)와 상호작용 항을 동시에 포함할 수 있습니다.

\[E[Y \mid X, Z] = \beta_0 + \beta_1 X + \beta_2 Z + \beta_3 (X \times Z)\]

여기서 \(\beta_3\)가 상호작용 효과를 나타냅니다.

14.2.1 IPW를 활용한 상호작용 추정

성향 점수 가중치(IPW)를 사용하면 가중 결과 모델에 상호작용 항을 추가해 이질적 효과를 추정할 수 있습니다.

library(propensity)

propensity_model <- glm(
  park_extra_magic_morning ~ park_ticket_season + park_close + park_temperature_high,
  data = seven_dwarfs_9,
  family = binomial()
)

seven_dwarfs_9_with_wt <- propensity_model |>
  augment(type.predict = "response", data = seven_dwarfs_9) |>
  mutate(w_ate = wt_ate(.fitted, park_extra_magic_morning))

# 티켓 시즌과의 상호작용 포함
fit_interaction <- lm(
  wait_minutes_posted_avg ~
    park_extra_magic_morning * park_ticket_season,
  data = seven_dwarfs_9_with_wt,
  weights = w_ate
)

tidy(fit_interaction, conf.int = TRUE)
# A tibble: 6 × 7
  term  estimate std.error statistic   p.value conf.low
  <chr>    <dbl>     <dbl>     <dbl>     <dbl>    <dbl>
1 (Int…     77.8      2.42     32.1  3.24e-106     73.0
2 park…     21.7      3.39      6.40 5.07e- 10     15.0
3 park…    -11.7      2.87     -4.08 5.64e-  5    -17.3
4 park…    -14.3      3.37     -4.24 2.88e-  5    -20.9
5 park…    -20.2      4.04     -5.00 9.07e-  7    -28.1
6 park…    -19.9      4.71     -4.23 2.93e-  5    -29.2
# ℹ 1 more variable: conf.high <dbl>

결과에서 park_extra_magic_morning:park_ticket_seasonvalue 같은 항들이 상호작용 추정치입니다. 이 계수들은 각 티켓 시즌의 엑스트라 매직 아워 효과가 기준 시즌(peak)과 얼마나 다른지 보여줍니다.

14.2.2 상호작용의 가산적(\(\times\) 절대적) vs. 승법적(\(\times\) 상대적) 척도

상호작용은 가산적(additive) 척도승법적(multiplicative) 척도 모두에서 정의할 수 있으며, 두 척도의 상호작용이 항상 일치하지는 않습니다.

  • 가산적 상호작용(additive interaction): 두 요인이 결합했을 때의 효과가 각 효과의 합보다 크거나 작은 경우
  • 승법적 상호작용(multiplicative interaction): 로지스틱 회귀 등 곱셈 척도에서 두 요인의 효과를 곱한 것보다 효과가 크거나 작은 경우

공중보건학에서는 가산적 상호작용이 특히 중요합니다. 가산적 상호작용이 없다는 가정은 모든 하위 집단에서 개입 효과의 절대적 크기가 같음을 뜻하기 때문입니다.

힌트상호작용 해석 시 주의 사항

상호작용 계수는 해석하기 까다로운 편입니다. 특히 연속형 변수 간의 상호작용은 항 자체만으로는 직관적으로 이해하기 어렵습니다. 이럴 때는 예측 그림(prediction plots)으로 상호작용을 시각화하는 것이 좋습니다.

library(ggplot2)

# 각 조합의 예측값 계산
pred_data <- expand.grid(
  park_extra_magic_morning = c(0, 1),
  park_ticket_season = unique(seven_dwarfs_9$park_ticket_season)
) |>
  mutate(
    pred = predict(fit_interaction, newdata = pick(everything())),
    emm_label = ifelse(park_extra_magic_morning == 1,
                       "엑스트라 매직 아워 있음", "엑스트라 매직 아워 없음")
  )

ggplot(pred_data, aes(
  x = park_ticket_season,
  y = pred,
  color = emm_label,
  group = emm_label
)) +
  geom_point(size = 3) +
  geom_line(linewidth = 1) +
  labs(
    x = "티켓 시즌",
    y = "예측 평균 게시 대기 시간 (분)",
    color = NULL,
    title = "티켓 시즌별 엑스트라 매직 아워의 효과"
  )
그림 14.1: 티켓 시즌별 엑스트라 매직 아워가 평균 게시 대기 시간에 미치는 효과. 상호작용이 있다면 선들의 기울기나 차이가 시즌마다 달라질 것입니다.

이 그림에서 두 선이 평행하지 않으면 상호작용(가산적 척도 기준)이 있음을 시각적으로 알 수 있습니다. 각 시즌의 두 그룹 간 차이가 엑스트라 매직 아워의 효과이며, 이 차이가 시즌마다 다르면 효과 수정이 일어난 것입니다.