Рассмотрим пример оценивания моделей со смешанными эффектами на кросс-секционных данных из статьи [Luke D.A., Krauss M., 2004], которую Вы можете скачать по ссылке. Авторы изучают факторы голосования членов Конгресса США в интересах табачной индустрии. В фокусе внимания – различия во взаимосвязи размера финансирования комитетами политического действия (PAC) от табачных корпораций и голосования в интересах табачной индустрии. В частности, авторы тестируют, есть ли различия в этой взаимосвязи между представителями Демократической и Республиканской партий. Воспроизведем часть результатов, полученных в исследовании, а в домашнем задании Вас ожидает продолжение.
Ниже представлено краткое описание переменных:
Переменные на первом уровне (изменяются по членам Конгресса):
Предиктор на втором уровне (изменяется по штатам, при этом внутригрупповой изменчивости нет):
Откроем массив данных, группирующую переменную (штат) сразу для последующего анализа зададим как факторную.
ME<-read_dta("C:/Users/User/OneDrive/Рабочий стол/RAPDC_lab3.dta")
ME$state_id <- as.factor(ME$state)
ME <- na.omit(ME)
head(ME)
Как мы видим, данные являются вложенными: более крупные единицы анализа – штаты (2-ой уровень), внутри которых наблюдается изменчивость по членам Конгресса (1-ый уровень). При этом отсылка к такой структуре данных не может быть единственным основанием для оценивания моделей со смешанными эффектами. Не забываем также о том, что для оценивания ME-моделей на втором уровне должно быть достаточно большое количество наблюдений (минимальное количество – порядка 30 для самой базовой экономной спецификации модели, с ростом количества параметров растут требования и к объему выборки). В нашем случае – 50 штатов на втором уровне. Для более полного обоснования мы отмечаем, что интерес представляют различия во взаимосвязи, а не только разные стартовые значения голосования в интересах табачной индустрии: а именно, авторы статьи хотели проверить, есть ли между штатами различия во взаимосвязи финансирования комитетами политического действия от табачных корпораций и голосования в интересах табачной индустрии. Проиллюстрируем различия между штатами на графике ниже:
ggplot(ME, aes(x=money, y=votepct)) +
geom_smooth(method = "lm", se = FALSE) +
geom_point() +
facet_wrap("state_id")
Видно, что данные несбалансированные, о чем говорит разное количество наблюдений в штатах. Модель со смешанными эффектами несколько сглаживает ситуацию несбалансированности. Здесь надо вспомнить про так называемый “эффект сжатия” (shrinkage effect). С одной стороны, считается среднее общее по всей выборке (будь то константа или взаимосвязь в среднем) – отсылка к фиксированному эффекту, с другой стороны, считается среднее по j-ой подгруппе (то есть, именно специфика j-ого штата). Если по штату (в более общем смысле – пространственной единице на втором уровне) мало наблюдений, то значения (константы / коэффициента взаимосвязи) для такого штата будет “стягиваться” к среднему общему по всей выборке в силу того, что такой штат рассматривается в рамках ME-модели как “ненадежный”, иными словами, на такую информацию в условиях ограниченного количества наблюдений нельзя полагаться. Кстати, интерактивные картинки того, как происходит “сжатие”, можно посмотреть здесь.
Реализуем стратегию bottom-up при уточнении спецификации модели со смешанными эффектами, то есть, начинаем с простейшей ANOVA-модели, а далее будем последовательно усложнять модель.
1. ANOVA-модель
Оценим нулевую модель (то есть, без объясняющих переменных) и рассчитаем на основе полученной информации ICC.
Пояснение по коду: при использовании lmer для оценивания ME-модели, до скобок записываем фиксированные эффекты, к примеру, в нашем случае используется фиксированный эффект только на константу, поэтому ставим 1; далее в скобках записываем случайные эффекты, так, 1 в скобках означает случайный эффект на константу. Не забываем после вертикальной разделительной черты указать группирующую переменную – штат. Через логический оператор обозначаем, какой метод оценивания используем: REML = FALSE означает, что мы отменяем оценивание через restricted maximum likelihood method (подходит, если у Вас количество наблюдений на втором уровне на грани – 30 или чуть меньше), вместо этого предпочитаем классический MLE
null <- lmer(votepct ~ 1 + (1|state_id), REML = FALSE, data = ME)
summary(null)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ 1 + (1 | state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## 319.7 332.5 -156.9 313.7 524
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.23742 -0.85315 0.03887 0.75955 2.10386
##
## Random effects:
## Groups Name Variance Std.Dev.
## state_id (Intercept) 0.03534 0.1880
## Residual 0.09264 0.3044
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.53094 0.03114 45.57848 17.05 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
В выдаче мы видим две части: случайные эффекты (там вариация и для \(u_{oj}\), и для остатков на первом уровне – residuals) и фиксированные эффекты (оценка коэффициента константы, составляющая 0.53094 – среднее значение доли голосов в поддержку табачной индустрии по всей выборке). На основе информации, представленной в части Random effects, можем рассчитать ICC, поделив вариацию зависимой переменной на уровне штатов на общую вариацию.
0.03534 / (0.03534+0.09264)
## [1] 0.2761369
Получается, что около 28% изменчивости доли голосов в поддержку табачной индустрии объясняется на уровне штатов, оставшаяся изменчивость – на уровне членов Конгресса.
Можем также получить ICC автоматически следующим образом:
performance::icc(null)
## # Intraclass Correlation Coefficient
##
## Adjusted ICC: 0.276
## Conditional ICC: 0.276
Здесь скорректированное значение ICC и без корректировки совпадают, но так бывает не всегда. В дальнейшем Вам понадобится скорректированный ICC.
Казалось бы, все просто: видим значение 0.28 в качестве ICC – делаем вывод о том, что нам нужен такой класс моделей, который работает с неоднородными данными. Однако не стоит торопиться. Вполне может быть так, что значение ICC (примерно 0.28) – результат наличия двух-трех нетипичных наблюдений. Во избежание ошибочной интерпретации и поспешного вывода мы опираемся на следующий график, сравнивающий средние наблюдаемые (те, что в наших данных) с результатами группировки на основе многократного извлечения случайных выборок из имеющейся совокупности данных. Давайте разъясним, что происходит пошагово, и как это отражается на графике ниже.
Упорядочиваем исходные наблюдаемые средние по штатам значения доли голосов в поддержку табачной индустрии и располагаем их на графике (так, Вы видите столбцы в порядке возрастания).
Генерим случайным образом подгруппы (псевдо-штаты) из имеющейся совокупности данных и считаем средние по полученным подгруппам, упорядочиваем от меньшего к большему. При генерации мы сохраняем количество подгрупп (то есть, в нашем случае – 50 по количеству штатов) и размер исходных выборок.
Много раз повторяем процедуру из второго шага. Если Вы посмотрите на код ниже, то сейчас мы задаем 1000 репликаций. Далее усредняем полученные результаты по тысячи репликациям и получаем сглаженную линию с доверительным интервалом, рассчитанным на основе указанной процедуры бутстрэпа (см. график).
graph.ran.mean(ME$votepct, ME$state_id, nreps=1000, bootci=TRUE)
Если края столбцов (наблюдаемые средние) попадают в границы доверительного интервала, то в целом такой результат не отличается от того, что был получен посредством случайного распределения наблюдений на подгруппы. По нашему графику видно, что достаточно много столбцов либо ниже границ доверительного интервала, либо выше, что свидетельствует в пользу неоднородности массива, с которым мы работаем. Если бы практически все столбцы укладывались в границы доверительного интервала, это бы означало, что значимой неоднородности здесь нет, а ICC – результат нескольких выбивающихся нетипичных штатов.
Выгрузку предсказанных значений случайных эффектов (BLUP) можно получить следующим образом:
ranef(null)
## $state_id
## (Intercept)
## AK 0.11862432
## AL 0.22093945
## AR 0.07706954
## AZ 0.11410831
## CA -0.08432885
## CO 0.11590471
## CT -0.27682984
## DE -0.08694932
## FL 0.03672017
## GA 0.15004250
## HI -0.19312165
## IA -0.01096309
## ID 0.17824836
## IL -0.03809144
## IN 0.12170401
## KS 0.13242530
## KY 0.30474305
## LA 0.14575977
## MA -0.41172037
## MD -0.16884885
## ME -0.15538418
## MI -0.11329025
## MN -0.11869996
## MO 0.09653619
## MS 0.13394838
## MT 0.01846444
## NC 0.25355886
## ND -0.20275882
## NE 0.08519685
## NH 0.14588531
## NJ -0.18059014
## NM 0.01350197
## NV -0.15383526
## NY -0.17127608
## OH -0.03952206
## OK 0.26547879
## OR -0.15167174
## PA -0.05883805
## RI -0.24919611
## SC 0.18945244
## SD -0.13601415
## TN 0.15722713
## TX 0.06704161
## UT 0.03820302
## VA 0.12892897
## VT -0.13544721
## WA -0.12374887
## WI -0.11458797
## WV -0.12873965
## WY 0.19474048
##
## with conditional variances for "state_id"
Так, для Аляски (AK) BLUP для константы составляет 0.1186, то есть, среднее значение доли голосов в поддержку табачной индустрии для Аляски больше на 0.1186, чем среднее по всей выборке.
2. Добавляем фиксированные эффекты на предикторы
В первой модели предполагаем, что финансирование от PAC табачных корпораций – значимая объясняющая переменная, при этом пока исходим из простого предположения, что в среднем по всей выборке эффект финансирования одинаковый. В соответствии с этим включаем фиксированный эффект на этот предиктор. Оценим модель, предварительно отменив экспоненциальную запись.
options(scipen = 999)
model1 <- lmer(votepct ~ money + (1|state_id), REML = FALSE, data = ME)
summary(model1)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ money + (1 | state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## 237.6 254.7 -114.8 229.6 523
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.33857 -0.82138 -0.07304 0.78857 2.21384
##
## Random effects:
## Groups Name Variance Std.Dev.
## state_id (Intercept) 0.01707 0.1307
## Residual 0.08208 0.2865
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.4287491 0.0259064 52.4900288 16.550 <0.0000000000000002 ***
## money 0.0076100 0.0007771 500.1512953 9.793 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## money -0.404
В этой модели по-прежнему только случайный эффект на константу. Давайте изобразим на графике индивидуальные стартовые точки (средние значения доли голосов в поддержку табачной индустрии при условии отсутствия финансирования) для каждого штата, что представляет сумму фиксированного эффекта на константу и случайного эффекта (\(\gamma_{00} + u_{oj}\)), также на графике будут изображены доверительные интервалы для константы.
dotplot(ranef(model1, condVar=TRUE))
## $state_id
Большинство доверительных интервалов включают 0, и сами доверительные интервалы пересекаются, что говорит в целом о схожести стартовых значений для большинства штатов, с этой точки зрения неоднородности не так уж и много.
В ряде случаев не очень удобно интерпретировать результаты в терминах отклонений, вместо этого хотелось бы сразу получить среднее стартовое значение и взаимосвязь ключевого предиктора и зависимой переменной в j-ой пространственной единице. Рассчитаем оценки констант и коэффициента взаимосвязи финансирования от PAC табачных корпораций и доли голосов в поддержку табачной индустрии для каждого штата. В квадратных скобках обозначим номер параметра, который нас интересует. [,1] – для константы, [,2] – для коэффициента взаимосвязи.
model1_intercept <- coef(model1)$state_id[,1]
model1_slope <- coef(model1)$state_id[,2]
state_unique <- unique(ME$state_id)
data.frame(state_unique, model1_intercept, model1_slope)
Мы получили разные константы, при этом для всех штатов одинаковая взаимосвязь. Это обусловлено тем, что когда мы задавали спецификацию модели, мы исходили из предпосылки, что есть значимые отклонения в стартовых точках (случайный эффект на константу), а взаимосвязь финансирования и отклика одинаковая (только фиксированный эффект для переменной money без соответствующего случайного эффекта на наклон).
Продемонстрируем, как можно сравнивать модели. На данном этапе сравним нулевую модель и первую модель. Данные модели являются вложенными: можем получить model1 из нулевой модели посредством добавления параметра – фиксированного эффекта для money. Проверяем гипотезу о равенстве коэффициента при money нулю. Или иными словами, в рамках теста отношения правдоподобия для вложенных моделей мы задаем вопрос, а вносит ли предиктор (money) значимый вклад в объяснение изменчивости доли голосов в поддержку табачной индустрии?
anova(null, model1)
В выдаче смотрим на статистику \(\chi^2\), p-value близко к 0, следовательно, нулевую гипотезу отвергаем. То есть, выбираем модель менее экономную, с включенным предиктором money. Также можно сравнить информационные критерии, показывающие, сколько информации мы теряем. Важно найти баланс между нагруженностью модели и ее информативностью. BIC больше штрафует за добавление параметров по сравнению с AIC. Как по AIC, так и по BIC мы видим, что лучше model1 (так как меньше значения AIC, BIC).
Далее продолжаем расширять спецификацию модели, добавляя партийную принадлежность в качестве предиктора на первом уровне. Опять же исходим из простого допущения о том, что в среднем по всей выборке взаимосвязь партийной принадлежности и доли голосов в поддержку табачной индустрии одинакова, нет различий между штатами. Поэтому в модель вносится фиксированный эффект на партийную принадлежность.
model2 <- lmer(votepct ~ money + party + (1|state_id), REML = FALSE, data = ME)
summary(model2)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ money + party + (1 | state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## -302.3 -280.9 156.1 -312.3 522
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.3363 -0.5885 -0.0693 0.5980 4.1462
##
## Random effects:
## Groups Name Variance Std.Dev.
## state_id (Intercept) 0.006192 0.07869
## Residual 0.029328 0.17125
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.1997207 0.0172421 76.4322756 11.583 <0.0000000000000002 ***
## money 0.0044760 0.0004758 507.4162925 9.407 <0.0000000000000002 ***
## party 0.4961530 0.0161260 519.2072838 30.767 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) money
## money -0.262
## party -0.432 -0.214
anova(model1, model2)
Оценки модели показывают, что для республиканцев доля голосов в поддержку табачной индустрии выше в среднем при прочих равных на 0.49 по сравнению с представителями Демократической партии. В соответствии с тестом отношения правдоподобия менее экономная модель (с фиксированным эффектом на партийную принадлежность) более предпочтительна.
На этом не останавливаемся и добавляем фиксированный эффект для переменной площадь табачных плантаций – характеристике на втором уровне (есть только межгрупповая изменчивость). Здесь мы следуем логике авторов, указывающих на необходимость проконтролировать переменные – характеристики штатов, а не только характеристики членов Конгресса. Мы видим, что у оценки коэффициента при acres пограничный уровень значимости (тест отношения правдоподобия, сравнивающий модель 2 и модель 3, показывает схожие результаты), однако из этого пока не следует, что этот предиктор нужно сразу удалять из модели. Вспомним, что у авторов статьи также была идея протестировать, есть ли различия во взаимосвязи характеристик членов Конгресса и доли голосов в поддержку табачной индустрии в зависимости от площади табачных плантаций, вполне может быть так, что acres окажется значимой переменной-модератором.
model3 <- lmer(votepct ~ money + party + acres + (1|state_id), REML = FALSE, data = ME)
summary(model3)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ money + party + acres + (1 | state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## -304.1 -278.5 158.1 -316.1 521
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.3490 -0.5823 -0.0572 0.5970 4.1815
##
## Random effects:
## Groups Name Variance Std.Dev.
## state_id (Intercept) 0.005664 0.07526
## Residual 0.029258 0.17105
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.1929140 0.0171814 72.2590879 11.228 < 0.0000000000000002
## money 0.0041863 0.0005002 512.9078659 8.369 0.000000000000000554
## party 0.4970312 0.0160821 520.4813746 30.906 < 0.0000000000000002
## acres 0.0006535 0.0003293 49.2721164 1.985 0.0528
##
## (Intercept) ***
## money ***
## party ***
## acres .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) money party
## money -0.187
## party -0.434 -0.207
## acres -0.186 -0.323 0.014
anova(model2, model3)
3. Добавляем случайные эффекты для того, чтобы учесть различия во взаимосвязи
На предыдущем шаге мы не учли возможные различия между штатами во взаимосвязи характеристик членов Конгресса и доли голосов в поддержку табачной индустрии. Исправим это упущение в последующих спецификациях. Так, в модели 4.1 учитывается различия во взаимосвязи финансирования от PAC табачных корпораций и отклика – для этого добавляем \(u_{1j}\).
model4.1 <- lmer(votepct ~ money + party + acres + (1 + money|state_id), REML = FALSE, data = ME)
summary(model4.1) # non-convergence
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ money + party + acres + (1 + money | state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## -305.0 -270.9 160.5 -321.0 519
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.2680 -0.6009 -0.0617 0.5485 4.0688
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## state_id (Intercept) 0.008189956 0.090498
## money 0.000003755 0.001938 -0.71
## Residual 0.028305100 0.168241
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.1982417 0.0187228 48.4372247 10.588 0.0000000000000337
## money 0.0044453 0.0006069 31.6784598 7.325 0.0000000266203122
## party 0.4927196 0.0161233 519.0842813 30.559 < 0.0000000000000002
## acres 0.0007538 0.0003089 9.7119050 2.440 0.0355
##
## (Intercept) ***
## money ***
## party ***
## acres *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) money party
## money -0.392
## party -0.413 -0.179
## acres -0.131 -0.300 0.022
## optimizer (nloptwrap) convergence code: 0 (OK)
## Model failed to converge with max|grad| = 0.0597448 (tol = 0.002, component 1)
Что-то пошло не так, а именно, мы видим предупреждение о несходимости алгоритма.
model4.1 <- lmer(votepct ~ money + party + acres + (1 + money|state_id), REML = FALSE, data = ME)
summary(model4.1) # non-convergence
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ money + party + acres + (1 + money | state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## -305.0 -270.9 160.5 -321.0 519
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.2680 -0.6009 -0.0617 0.5485 4.0688
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## state_id (Intercept) 0.008189956 0.090498
## money 0.000003755 0.001938 -0.71
## Residual 0.028305100 0.168241
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.1982417 0.0187228 48.4372247 10.588 0.0000000000000337
## money 0.0044453 0.0006069 31.6784598 7.325 0.0000000266203122
## party 0.4927196 0.0161233 519.0842813 30.559 < 0.0000000000000002
## acres 0.0007538 0.0003089 9.7119050 2.440 0.0355
##
## (Intercept) ***
## money ***
## party ***
## acres *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) money party
## money -0.392
## party -0.413 -0.179
## acres -0.131 -0.300 0.022
## optimizer (nloptwrap) convergence code: 0 (OK)
## Model failed to converge with max|grad| = 0.0597448 (tol = 0.002, component 1)
model4.1.1 <- lmer(votepct ~ money + (1 + money|state_id), REML = FALSE, data = ME)
## boundary (singular) fit: see help('isSingular')
summary(model4.1.1) # non-convergence
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ money + (1 + money | state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## 223.9 249.5 -105.9 211.9 521
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.05956 -0.76422 -0.08976 0.73254 2.35112
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## state_id (Intercept) 0.03470289 0.186287
## money 0.00001856 0.004308 -1.00
## Residual 0.07775704 0.278849
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.4465684 0.0320924 41.5101980 13.915 < 0.0000000000000002 ***
## money 0.0081311 0.0009472 30.8182293 8.585 0.00000000113 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## money -0.791
## optimizer (nloptwrap) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
В чем может быть проблема? Вариация случайного эффекта для money ничтожна мала. Давайте посмотрим на следующую картинку: сравним предсказание в среднем по всей выборке и предсказание с учетом специфики по штатам (случайного эффекта как на константу, так и на наклон). Команда predict(model) по умолчанию рассчитывает предсказанные значения с учетом специфики по подгруппам. Если используем predict(model, re.form = NA), то предсказание создается только на основе фиксированных эффектов, и как следствие, одинаково для всех штатов.
ME %>%
# add predicted values to the dataset
mutate(pr_re = predict(model4.1.1), pr_fe = predict(model4.1.1, re.form = NA)) %>%
# visualize
ggplot(aes(x=money, y=pr_re, group = state_id)) + theme_light() + geom_line() +
geom_line(color = "red", aes(money, pr_fe)) + facet_wrap(~state_id)
Как мы видим на графике, несмотря на то, что некоторые отличия во взаимосвязи есть, если сравнивать средние значения по всей выборке и с учетом случайных эффектов, однако в целом характер взаимосвязи остается тем же самым. Меняется только выраженность взаимосвязи.
Что если по штатам различается эффект партийной принадлежности? Проверим аналогичной спецификацией, добавив случайный эффект на party.
model4.2 <- lmer(votepct ~ party + (1 + party|state_id), REML = FALSE, data = ME)
summary(model4.2)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ party + (1 + party | state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## -242.4 -216.8 127.2 -254.4 521
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.7731 -0.5559 0.0134 0.5491 4.7581
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## state_id (Intercept) 0.02714 0.1647
## party 0.01063 0.1031 -0.88
## Residual 0.03021 0.1738
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.25694 0.02800 40.00208 9.177 0.0000000000216 ***
## party 0.51259 0.02386 36.35950 21.483 < 0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## party -0.790
И модель с полным набором исходных предикторов:
model4.2.1 <- lmer(votepct ~ money + acres + party + (1 + party|state_id), REML = FALSE, data = ME)
summary(model4.2.1)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ money + acres + party + (1 + party | state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## -312.0 -277.8 164.0 -328.0 519
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.7460 -0.5764 -0.0002 0.5632 4.5800
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## state_id (Intercept) 0.010816 0.10400
## party 0.008485 0.09211 -0.73
## Residual 0.027284 0.16518
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.2047760 0.0209332 34.7334789 9.782 0.00000000001630022
## money 0.0040650 0.0004947 510.9469193 8.217 0.00000000000000173
## acres 0.0005924 0.0003174 36.9971747 1.866 0.0699
## party 0.4882487 0.0222164 37.8990776 21.977 < 0.0000000000000002
##
## (Intercept) ***
## money ***
## acres .
## party ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) money acres
## money -0.164
## acres -0.142 -0.325
## party -0.669 -0.137 -0.001
dotplot(ranef(model4.2.1, condVar=TRUE))
## $state_id
В выдаче модели 4.2.1 в части случайных эффектов есть оценка такого параметра Corr, составляющая \(-0.73\). Это корреляция между случайными эффектами для константы и взаимосвязи партийной принадлежности и доли голосов в поддержку табачной индустрии. Изобразим на графике эту взаимосвязь. Получается, что чем ниже исходный уровень голосования в поддержку табачной индустрии, тем менее выражена взаимосвязь партийной принадлежности и данной зависимой переменной. С одной стороны, за этим может стоять содержательная история, которую интересно “раскрутить” в исследовании. С другой стороны, значимую корреляцию на данном этапе мы можем получить и в результате некоторых пропущенных переменных.
random4.2.1 <- ranef(model4.2.1)
unique <- cbind((random4.2.1$state_id[,1]),(random4.2.1$state_id[,2]))
plot(unique,
xlab = 'Intercepts', ylab = "Slopes ",
main = "Correlation between BLUP Intercepts and Slopes")
Представим, что корреляция не так уж велика (к примеру, по модулю не превышает 0.3). Тогда можно пожертвовать этим параметром, и во имя более экономной спецификации внести ограничение, заключающееся в том, что данная корреляция равна 0. Такое ограничение можно прописать в явном виде, изменив структуру корреляционной матрицы. Из library multilevel используем lme для переоценки модели, при этом предлагаем диагональную матрицу pdDiag для случайных эффектов: в такой матрице элементы вне главной диагонали равны 0.
model_nlme_1 <- lme(votepct ~ money + party + acres, random = list(state_id = pdDiag(~1 + ~party)), method = "ML", data = ME)
summary(model_nlme_1)
## Linear mixed-effects model fit by maximum likelihood
## Data: ME
## AIC BIC logLik
## -307.9102 -278.0398 160.9551
##
## Random effects:
## Formula: ~1 + ~party | state_id
## Structure: Diagonal
## (Intercept) party Residual
## StdDev: 0.07850753 0.06907026 0.1661866
##
## Fixed effects: votepct ~ money + party + acres
## Value Std.Error DF t-value p-value
## (Intercept) 0.1934876 0.017789906 475 10.876257 0.0000
## money 0.0041458 0.000497678 475 8.330253 0.0000
## party 0.4858930 0.019899316 475 24.417574 0.0000
## acres 0.0009781 0.000365842 48 2.673609 0.0102
## Correlation:
## (Intr) money party
## money -0.185
## party -0.382 -0.153
## acres -0.204 -0.298 -0.006
##
## Standardized Within-Group Residuals:
## Min Q1 Med Q3 Max
## -3.706280444 -0.602561498 -0.003090901 0.538173214 4.481036555
##
## Number of Observations: 527
## Number of Groups: 50
Несмотря на то, что модель со смешанными эффектами в явном виде учитывает специфику единиц анализа на втором уровне (в нашем случае – штатов), это не избавляет нас от необходимости выявления влиятельных наблюдений. По графику ниже на основании меры Кука видно, что такими влиятельными наблюдениями для модели 4.2 являются штаты Кентукки, Нью-Джерси и Калифорния.
inf <- influence(model4.2, group = "state_id", data = ME)
cooks.distance.estex(inf, sort=TRUE)
## [,1]
## AK 0.00004054182
## NH 0.00017916274
## AZ 0.00075076707
## HI 0.00084344245
## MN 0.00104960260
## WV 0.00187762982
## KS 0.00221803193
## NE 0.00263385176
## MT 0.00272537048
## ND 0.00344670156
## PA 0.00418566106
## FL 0.00453735574
## AR 0.00455857983
## NV 0.00456286730
## ID 0.00518232184
## OH 0.00519854919
## OR 0.00616596050
## WY 0.00791596535
## MI 0.00839486907
## SD 0.00841956199
## IA 0.00889327204
## WA 0.01177476240
## NM 0.01235928103
## TX 0.01254590812
## OK 0.01283935538
## MS 0.01516498980
## CO 0.02028902789
## IN 0.02223470186
## MA 0.02245247585
## LA 0.02251916324
## MD 0.02253094147
## VT 0.02463733979
## MO 0.02611022862
## RI 0.02679411108
## NY 0.02710795542
## SC 0.02892248805
## VA 0.02923190794
## DE 0.03121342084
## GA 0.03553045880
## WI 0.03696959394
## UT 0.03831808836
## IL 0.04387885446
## CT 0.05006207459
## ME 0.06476927772
## TN 0.07166585615
## AL 0.07237961159
## NC 0.07920816415
## KY 0.08540665468
## CA 0.09817495570
## NJ 0.30782079613
plot(inf, which = "cook", xlab = "COOK'S MEASURE", cutoff = 4/length(state_unique))
Проверим также, можно ли считать распределение остатков на первом уровне и случайных эффектов близким к нормальному (одно из допущений ME-модели). Для этого изобразим графики в формате QQ-plot (сравнение квантилей эмпирического и теоретического нормального распределения) и наложения графиков функций плотности друг на друга для остатков первого уровня (на уровне членов Конгресса), эти графики показывают, что наиболее значимые отклонения предсказуемо по хвостам распределения. В частности, в рамках домашнего задания Вам предстоит подумать, как можно больше приблизить распределение к нормальному.
plot_model(model4.2.1, type = "diag")[1]
## [[1]]
plot_model(model4.2.1, type = "diag")[3]
## [[1]]
На следующем графике посмотрим на распределение для случайных эффектов. В целом приближение к нормальному достаточно хорошее.
plot_model(model4.2.1, type = "diag")[2]
## [[1]]
## [[1]]$state_id
4. Добавляем cross-level interaction
В соответствии с одной из гипотез авторов добавляем в модель переменную взаимодействия между характеристиками разных уровней – партийной принадлежности и площади табачных плантаций. Оценка коэффициента при данной переменной взаимодействия оказывается значимой, что говорит о том, что в штатах с большей площадью табачных плантаций эффект партийной принадлежности на долю голосов в поддержку табачной индустрии становится менее выраженным. Оценка коэффициента при acres теперь приобретает значимость, что неудивительно, так как теперь у этого коэффициента меняется интерпретация: в данном случае интерпретируем в терминах условного эффекта, а именно, эффекта для подвыборки представителей Демократической партии (party = 0).
model5 <- lmer(votepct ~ money + party + acres + party*acres + (1 + party|state_id), REML = FALSE, data = ME)
summary(model5)
## Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
## method [lmerModLmerTest]
## Formula: votepct ~ money + party + acres + party * acres + (1 + party |
## state_id)
## Data: ME
##
## AIC BIC logLik deviance df.resid
## -322.8 -284.4 170.4 -340.8 518
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.7296 -0.5834 0.0081 0.5848 4.5818
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## state_id (Intercept) 0.009137 0.09559
## party 0.004629 0.06804 -0.71
## Residual 0.027154 0.16479
## Number of obs: 527, groups: state_id, 50
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 0.1859884 0.0202907 38.4145889 9.166 0.00000000003272077
## money 0.0040194 0.0004896 512.5065956 8.210 0.00000000000000181
## party 0.5164640 0.0209246 38.8941096 24.682 < 0.0000000000000002
## acres 0.0019306 0.0004851 60.0507199 3.980 0.000188
## party:acres -0.0017391 0.0004644 55.5266832 -3.745 0.000431
##
## (Intercept) ***
## money ***
## party ***
## acres ***
## party:acres ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) money party acres
## money -0.156
## party -0.662 -0.159
## acres -0.272 -0.238 0.262
## party:acres 0.235 0.037 -0.336 -0.770
С одной стороны, такая модель отвечает задумке авторов. С другой стороны, не стоит забывать, что мы на предудущем шаге выявили, что вариация случайного эффекта для партийной принадлежности не так уж велика, поэтому включение дополнительного модератора, объясняющего различия во взаимосвязи, может быть сомнительным.