Как стать автором
Обновить
72.42
Skillfactory
Онлайн-школа IT-профессий

Подробное руководство по методам синтетического контроля

Время на прочтение 16 мин
Количество просмотров 4.2K
Автор оригинала: Matteo Courthoud

Материал подготовлен к старту нашего флагманского курса по Data Science.



В настоящее время золотым стандартом расчёта причинного эффекта (causal effect) вмешательства (лечения, рекламы, продукта, и др.) на интересующий результат (болезнь, доход компании, довольство клиентов, и др.) — это A/B-тестирование, (также называемое рандомизированным контролируемым исследованием или РКИ). Мы случайным образом разбиваем множество исследуемых объектов (пациентов, пользователей, клиентов, и др.) на исследуемую и контрольную группы и подвергаем вмешательству первую из групп. Эта процедура гарантирует, что ожидаемая разница между группами вызвана именно изучаемым вмешательством.


Одно из основных допущений при A/B-тестировании — отсутствие взаимовлияния исследуемой и контрольной групп друг на друга. Например, считается получение лекарства пациентом из исследуемой группы не влияет на здоровье пациентов из контрольной группы, но это не всегда так. Возможно, мы пытаемся вылечить инфекционное заболевание, а две группы не изолированы друг от друга. В бизнесе частыми источниками предполагаемого взаимовлияния являются сетевой эффект (network effect) — сеть тем полезнее мне, чем больше там моих друзей или партнёров — и эффект общего рыночного равновесия (general equilibrium effect) — если я сделаю лучше один продукт, это может привести к снижению продаж его аналога.


По этой причине, чтобы свести взаимовлияние групп к минимуму, эксперименты часто проводят в довольно крупных масштабах. Опыты проводятся в рамках города, региона и даже целой страны. Однако у масштабных исследований есть другая проблема: они обходятся дороже. Дать лекарство 50% пациентов одной клиники обойдётся гораздо дешевле, чем дать его 50% городов в стране. Поэтому зачастую вмешательству подвергается всего несколько исследуемых объектов, но происходит это на протяжении более длительного периода времени.


В таких условиях очень действенным становится метод, который появился где-то 10 лет назад: Его называют методом синтетического контроля (Synthetic Control). Идея состоит во временной вариации данных вместо межсекционной (вариации по времени, а не по объектам). Этот метод чрезвычайно популярен в отрасли — например, в таких компаниях, как Google, Uber, Microsoft, и Amazon — потому что он легко интерпретируется и относится к ситуации, которая зачастую проявляется в крупных масштабах. Рассмотрим метод на конкретном примере. Исследуем эффективность использования автономных автомобилей с точки зрения агрегаторов такси.


Пример с автономными автомобилями


Допустим, вы агрегатор такси и хотите оценить эффективность включения в свой автопарк автономных автомобилей.


Нетрудно представить себе, с какими ограничениями столкнётся ваше A/B-тестирование в этом случае. Во-первых, отдельные поездки плохо поддаются рандомизации. Во-вторых, внедрение в тест автономных автомобилей выльется в круглую сумму. В-третьих, что важнее всего, со статистической точки зрения, такое внедрение не удастся провести на уровне отдельной поездки. Проблемой для нас станет "эффект перелива" (spillover effect) из исследуемой группы в контрольную: если автономные автомобили действительно эффективнее, они смогут обслужить больше клиентов в указанный срок, уменьшая число клиентов, доступных для таксистов-людей (контрольная группа). Это повлияет на ход эксперимента и исказит причинную интерпретацию результатов.


По всем названным причинам мы выбрали один город. Сущность синтетического контроля не позволяет нам этого сделать, а мы всё равно выберем… (тадаам)… Майами!


Панорама Майами


Я моделирую набор панельных данных по городам США с течением времени. Данные о выручке вымышлены, а социально-экономические показатели взяты с ресурса OECD 2022 Metropolitan Areas database. Я импортирую процесс генерации данных dgp_selfdriving() из src.dgp. Я также импортировал некоторые функции и библиотеки для построения графиков из src.utils.


from causalml.match import create_table_one

create_table_one(df, 'treated', ['density', 'employment', 'gdp', 'population', 'revenue'])

Зафиксированные данные


У нас есть данные по 46 крупнейшим городам США за 2002–2019 годы. Данная панель сбалансирована: все города рассматривались во всех временных рамках. Автономные автомобили введены в эксплуатацию в 2013 году.


Насколько исследуемый город, Майами, сравним с остальными городами выборки? При помощи функции create_table_one пакета causalml от Uber составим таблицу равновесия ковариантов (covariate balance table), содержащую средние значения наблюдаемых параметров для исследуемых и контрольных групп. Как подсказывает название функции, эта таблица всегда будет представлена первой при анализе причинной зависимости (causal inference analysis).


smf.ols('revenue ~ treated', data=df[df['post']==True]).fit().summary().tables[1]

Таблица равновесия


Как и ожидалось, наши города отказались несбалансированными группами. В случае Майами больше площадь города и плотность населения, но ниже уровень дохода и занятости населения.


Нас интересует влияние внедрения автономных автомобилей на нашу выручку (revenue).


Сначала планировалось проанализировать данные по принципу A/B-тестирования, путём сравнения исследуемой и контрольной группы. Эффект вмешательства можно оценить как разницу в средних значениях выручки (revenue) в исследуемой и контрольной группах после внедрения автономных автомобилей.


smf.ols('revenue ~ treated', data=df[df['post']==True]).fit().summary().tables[1]

Результаты регрессии


Влияние автономных автомобилей выглядит негативным, но не имеющим статистической значимости.


Наша основная проблема состоит в том, что вмешательство не распределялось случайным образом. Ему подвергнут один город, Майами, который с трудом поддаётся сравнению с другими городами.


Альтернативной процедурой может быть сравнение прибыли в рамках Майами до и после вмешательства.


smf.ols('revenue ~ post', data=df[df['city']==treated_city]).fit().summary().tables[1]

Результаты регрессии


Влияние автономных автомобилей выглядит положительным и статистически значимым.


Теперь проблема процедуры состоит в том, что с 2013 года произошло много других событий. Приписать результаты всех изменений автономным автомобилям можно только с большой натяжкой.


Эту проблему будет проще понять, построив график временной динамики выручки по городам. Сначала нужно перестроить наши данные в широкий формат, где каждый столбец соответствует городу, а строка — году.


df = df.pivot(index='year', columns='city', values='revenue').reset_index()

Теперь построим график зависимости выручки от времени для Майами и других городов.


cities = [c for c in df.columns if c!='year']df['Other Cities'] = df[[c for c in cities if c != treated_city]].mean(axis=1)

def plot_lines(df, line1, line2, year, hline=True):
    sns.lineplot(x=df['year'], y=df[line1].values, label=line1)
    sns.lineplot(x=df['year'], y=df[line2].values, label=line2)
    plt.axvline(x=year, ls=":", color='C2', label='Self-Driving Cars', zorder=1)
    plt.legend();
    plt.title("Average revenue per day (in M$)");

И раз уж речь идёт о Майами, используем соответствующую цветовую палитру.


sns.set_palette(sns.color_palette(['#f14db3', '#0dc3e2', '#443a84']))
plot_lines(df, treated_city, 'Other Cities', treatment_year)

png


После нововведения выручка по Майами, по всей видимости, растёт. Но рассматриваемые временные рамки очень неустойчивы. К тому же, в остальной части страны доходы также росли. Судя по этому графику, изменения очень трудно отнести к автономным автомобилям.


А можно ли сделать лучше?


Метод синтетического контроля


Ответ на этот вопрос — «да»! Метод синтетического контроля даёт возможность делать выводы о причинной зависимости, когда вмешательству подвергается всего один исследуемый объект и множество контрольных объектов, а исследование проводится в течение длительного времени. Идея проста: объединить неподвергутые вмешательству объекты так, чтобы они без проведения самого вмешательства как можно точнее имитировали поведение исследуемых нами. Затем используем этот «синтетический объект» в качестве контрольного. Этот метод был впервые представлен Абади и Гардезабалем (2003) под названием “Важнейшее нововведение последних лет в оценке политики”. Благодаря простоте и воспроизводимости метод также широко применяется в индустрии.


Постановка задачи


Примем, что для панели объектов i.i.d. i = 1, …, n в течение времени t=1, …,T мы рассмотрели множество переменных параметров (Xᵢₜ,Dᵢ,Yᵢₜ), которое включает


  • назначение вмешательства Dᵢ∈{0,1} (treated);
  • реакцию Yᵢₜ∈ℝ(revenue);
  • вектор характеристик Xᵢₜ∈ℝⁿ (population, density, employment и GDP).

Кроме того, в рассматриваемый момент времени t* (у нас это 2013 год) вмешательство назначено одному объекту (у нас это Майами). Мы различаем временные периоды до и после нововведения.


Следует подчеркнуть, что вмешательство D назначалось неслучайным образом, поэтому и разница в средних значениях между исследуемым объектом (объектами) и контрольной группой не является объективной оценкой среднего эффекта вмешательства.


Проблема


Проблема состоит в том, что мы, как обычно, не наблюдаем контрфактический результат для исследуемого объекта, то есть, мы не знаем, что случилось бы при отсутствии вмешательства. В этом и состоит фундаментальная проблема выводов о причинной зависимости.


Проще всего будет сравнить периоды до и после вмешательства. Это называется методом событийного анализа (event study approach).


Но мы можем сделать кое-что получше. Неслучайное распределение вмешательства не мешает нам рассмотреть объекты, которые этому вмешательству не подверглись.


В качестве переменной выходного параметра наблюдаются следующие значения:


Переменный выходной параметр


В этой формуле Y⁽ᵈ⁾ₐ,ₜ это выходной параметр в момент времени t, при назначении вмешательства a и статуса вмешательства d. По сути, у нас также есть проблема недостающих данных, поскольку мы не можем наблюдать Y⁽⁰⁾ₜ,ₚₒₛₜ: не известно, что случилось бы с объектами, подвергнутыми вмешательству (a=t), если бы вмешательства не произошло (d=0).


Решение


Оценить контрфактический результат для исследуемого объекта можно методом Дудченко-Инбенса (2018). Он будет представлен линейной комбинацией наблюдаемых результатов для объектов контрольной группы.


Результаты синтетического контроля


где


  • постоянная α учитывает разные варианты усреднения между двумя группами;
  • весовые коэффициенты βᵢ могут варьироваться между контрольными единицами i (без них это был бы метод сравнения разностей).

Как нам определиться с используемыми весовыми коэффициентами? Мы хотим аппроксимировать результаты методом синтетического контроля с максимально возможной точностью до нововведения. Первый подход — определения весовых коэффициентов следующим методом:


Синтетические контрольные весовые коэффициенты


То есть весовые коэффициенты таковы, что они минимизируют расстояние между наблюдаемыми признаками контрольных Xc и исследуемых Xₜ объектов до вмешательства.


Можно заметить близкое сходство с методом линейной регрессии. Действительно, наш метод очень похож на неё.


В линейной регрессии мы обычно имеем много наблюдений, несколько экзогенных параметров и один эндогенный параметр, и пытаемся выразить эндогенный параметр через линейную комбинацию экзогенных параметров для каждого объекта.


Линейная регрессия


В методе синтетического контроля у нас вместо этого много временных периодов (параметров), несколько контрольных объектов и один исследуемый объект. При этом мы пытаемся выразить исследуемый объект в виде линейной комбинации контрольных объектов для каждого периода времени.


Чтобы выполнить ту же операцию, нам, по сути, нужно транспонировать данные.


Транспонирование данных


После транспонирования мы вычисляем весовые коэффициенты синтетического контроля так же, как вычисляли бы коэффициенты регрессии. Однако теперь наблюдение соответствует периоду времени, а параметр — объекту.


Регрессия синтетического контроля


Заметьте, что транспонированные данные не лишены произвольно выбранных допущений. В методе линейной регрессии соотношение экзогенных и эндогенных параметров одинаково для всех наблюдений, а в методе синтетического контроля мы принимаем, что соотношение между исследуемыми и контрольными объектами не меняется со временем.


Bернёмся к нашим автомобилям


Вернёмся к нашим данным! Сначала запишем функцию synth_predict, которая использует входные данные из модели, обученной на контрольных городах, и пытается предсказать результат в исследуемом городе, Майами, до внедрения там автономного транспорта:


def synth_predict(df, model, city, year):
    other_cities = [c for c in cities if c not in ['year', city]]
    y = df.loc[df['year'] <= year, city]
    X = df.loc[df['year'] <= year, other_cities]
    df[f'Synthetic {city}'] = model.fit(X, y).predict(df[other_cities])
    return model

Оценим модели при помощи линейной регрессии:


from sklearn.linear_model import LinearRegressioncoef = synth_predict(df, LinearRegression(), treated_city, treatment_year).coef_

Насколько представление о выручке (revenue) до внедрения автономных автомобилей в Майами соответствует реальности? Каков предполагаемый эффект этого нововведения?


На оба вопроса наглядно ответит график сравнения фактической и прогнозируемой выручки по Майами:


plot_lines(df, treated_city, f'Synthetic {treated_city}', treatment_year)

Наблюдаемые и синтетические значения выручки по Майами


Судя по всему, автономные автомобили оказали ощутимое положительное влияние на выручку (revenue) по Майами: прогнозируемый тренд ниже реальных данных: их графики расходятся сразу же после внедрения автономных автомобилей.


С другой стороны, налицо переобучение [алгоритма линейной регрессии]: график выручки (revenue) полностью совпадает с графиком фактических данных. Учитывая высокую изменчивость выручки (revenue) в Майами, это выглядит, как минимум, странно.


Другая проблема касается весовых коэффициентов. Давайте построим график и для них.


df_states = pd.DataFrame({'city': [c for c in cities if c!=treated_city], 'ols_coef': coef})plt.figure(figsize=(10, 9))sns.barplot(data=df_states, x='ols_coef', y='city');

Синтетические контрольные весовые коэффициенты


У нас много отрицательных весовых коэффициентов, которые не имеют особого смысла с точки зрения причинно-следственных связей. Я понимаю, что Майами можно выразить через 0,2 Сент-Луиса, 0,15 Оклахома-сити и 0,15 Хартфорда. Но как понимать, что Майами соответствует -0,15 висконсинского города Милуоки?


Мы хотим интерпретировать наш синтетический контроль как взвешенное среднее по неохваченным нововведением городам.


Примечание переводчика. У автора здесь и ещё в одном месте стоит "states". В другом тексте в подобной ситуации я исходил из того, что автор хорошо всё продумал, и переоценил автора. В этот раз я сделаю ставку на то, что автор не подумал как следует о читателе, когда это писал (предположения у меня три: либо он (1) сначала сравнивал штаты, а при переходе к городам забыл в одном месте поменять, либо (2) имел в виду свои United States, но не подумал, что фраза будет звучать двусмысленно, либо, наконец, (3) он имел в виду не "штаты", а "состояния" и/или функцию df_states, но и в этом случае, судя по программному листингу, приведённому выше, и по сути анализа, этими "состояниями" являются как раз города. Поэтому, если любое из моих предположений и моё понимание текста верно, здесь можно заменить это "states" словом "города" и не путать читателя.

Поэтому все весовые коэффициенты должны быть положительными и составлять в сумме единицу.


Чтобы решить обе проблемы (переоценки весовых коэффициентов и переобучения), нам нужно наложить некоторые ограничения на весовые коэффициенты.


Ограничения весовых коэффициентов


Чтобы решить проблему переоцененных и отрицательных весовых коэффициентов, Абади, Даймонд и Хайнмюллер (2010) предложили следующие весовые коэффициенты:


Ограничения для весовых коэффициентов


Эта формула задаёт множество весовых коэффициентов β, для которых соблюдаются следующие условия:


  • взвешенные наблюдаемые характеристики контрольной группы Xc соответствуют наблюдаемым характеристиками исследуемой группы Xₜ до момента вмешательства;
  • их сумма равна 1;
  • они неотрицательны.

При таком подходе мы получаем поддающиеся интерпретации контрфактические значения (interpretable counterfactual) в виде взвешенного среднего значения по объектам, где нововведения не произошло.


Запишем нашу целевую функцию. Для этого я создал новый класс SyntheticControl(), у которого будет и описанная выше функция потерь loss, и методы fit для её аппроксимации, а также predict для прогнозирования значений по исследуемому объекту.


from toolz import partial
from scipy.optimize import fmin_slsqp

class SyntheticControl():

    # Loss function
    def loss(self, W, X, y) -> float:
        return np.sqrt(np.mean((y — X.dot(W))**2))

    # Fit model
    def fit(self, X, y):
        w_start = [1/X.shape[1]]*X.shape[1]
        self.coef_ = fmin_slsqp(partial(self.loss, X=X, y=y),
                         np.array(w_start),
                         f_eqcons=lambda x: np.sum(x) — 1,
                         bounds=[(0.0, 1.0)]*len(w_start),
                         disp=False)
        self.mse = self.loss(W=self.coef_, X=X, y=y)
        return self

    # Predict 
    def predict(self, X):
        return X.dot(self.coef_)

Теперь ту же процедуру можно повторить с использованием метода SyntheticControl вместо простого метода LinearRegression.


df_states['coef_synth'] = synth_predict(df, SyntheticControl(), treated_city, treatment_year).coef_
plot_lines(df, treated_city, f'Synthetic {treated_city}', treatment_year)

Наблюдаемые и синтетические данные по выручке в Майами


Как видите, признаков переобучения больше не наблюдается. Реальная и прогнозируемая выручка (revenue) близки, но не одинаковы. Причина в том, что ограничение неотрицательности приравнивает большинство коэффициентов к нулю (как Lasso).


И, кажется, эффект у нас снова стал отрицательным. Тем не менее давайте построим график сравнения этих двух линий, чтобы оценить порядок.


df_states['coef_synth'] = synth_predict(df, SyntheticControl(), treated_city, treatment_year).coef_
plot_lines(df, treated_city, f'Synthetic {treated_city}', treatment_year)

plot_difference(df, treated_city, treatment_year)

Различия между наблюдаемыми и синтетическими данными по Майами


Разница между графиками явно положительна и слегка увеличивается с течением времени.


Мы можем визуализировать и весовые коэффициенты, чтобы оценить предполагаемый контрфактический результат (что случилось бы в Майами без автономных автомобилей).


plt.figure(figsize=(10, 9))sns.barplot(data=df_states, x='coef_synth', y='city');

Ограничения весовых коэффициентов


Теперь параметр revenue для Майами выражен линейной комбинацией всего нескольких городов: Тампы, Сент-Луиса и, в меньшей степени, Лас-Вегаса. Теперь процедура стала более прозрачной.


Построение выводов


Так что же с построением выводов о причинных связях? Насколько сильно результат оценки отличается от нулевого? Или перефразируем этот вопрос в более практический: "насколько необычным является результат оценки в сравнении с нулевой гипотезой об отсутствии эффекта?".


Чтобы ответить на этот вопрос, проведём пермутационный тест/тест на перестановку (permutation test). Его идея заключается в том, что если вмешательство не имеет никакого эффекта, то эффект наблюдаемый в Майами эффект не должен сильно отличаться от эффекта в любом другом городе.


Поэтому мы повторяем описанную процедуру для остальных городов, и сравним их с оценочными данными по Майами.


fig, ax = plt.subplots()
for city in cities:
    synth_predict(df, SyntheticControl(), city, treatment_year)
    plot_difference(df, city, treatment_year, vline=False, alpha=0.2, color='C1', lw=3)
plot_difference(df, treated_city, treatment_year)

Распределение синтетических эффектов


Из графика мы видим две вещи. Во-первых, эффект для Майами довольно экстремален и поэтому, скорее всего, обусловлен не случайным шумом.


Во-вторых, как мы видим, есть ряд городов, для которых подгонка предварительно полученного тренда проблематична. В частности, есть линия, которая заметно ниже других. Это ожидаемо, поскольку для каждого города мы строим контрфактический тренд в виде выпуклой комбинации (convex combination) остальных городов. Города с самыми экстремальными значениями revenue очень полезны для построения контрфактических трендов других городов, но для них самих трудно построить контрфактический тренд.


Чтобы не искажать анализ, исключим города, для которых не удаётся построить "достаточно хорошую" с точки зрения среднеквадратической ошибки (MSE) контрфактическую модель.


Среднеквадратичная ошибка предварительного прогноза


В качестве эмпирического правила Абади, Даймонд и Хайнмюллер (2010) предложили исключать объекты, для которых прогнозируемая величина среднеквадратической ошибки вдвое превышает ту же величину для исследуемого объекта.


# Reference mse
mse_treated = synth_predict(df, SyntheticControl(), treated_city, treatment_year).mse

# Other mse
fig, ax = plt.subplots()
for city in cities:
    mse = synth_predict(df, SyntheticControl(), city, treatment_year).mse
    if mse < 2 * mse_treated:
        plot_difference(df, city, treatment_year, vline=False, alpha=0.2, color='C1', lw=3)
plot_difference(df, treated_city, treatment_year)

Распределение синтетических эффектов без непредсказуемых объектов


После исключения экстремальных данных эффект для Майами выглядит очень необычно.


Статистические данные, которые Абади, Даймонд и Хайнмюллер (2010) предложили использовать для проверки рандомизации — отношение среднеквадратических ошибок до и после вмешательства.


Отношение прогнозируемой среднеквадратичной ошибки до и после вмешательства


Мы можем вычислить p-величину как число наблюдений с более высоким коэффициентом:


lambdas = {}
for city in cities:
    mse_pre = synth_predict(df, SyntheticControl(), city, treatment_year).mse
    mse_tot = np.mean((df[f'Synthetic {city}'] - df[city])**2)
    lambdas[city] = (mse_tot - mse_pre) / mse_pre

print(f"p-value: {np.mean(np.fromiter(lambdas.values(), dtype='float') > lambdas[treated_city]):.4}")

p-value: 0.04348

Похоже, всего 4,3% городов имели больший коэффициент, чем Майами. Это соответствует p-величине 0,043. Мы можем визуально представить статистическое распределение при перестановке с помощью гистограммы.


fig, ax = plt.subplots()
_, bins, _ = plt.hist(lambdas.values(), bins=20, color="C1");
plt.hist([lambdas[treated_city]], bins=bins)
plt.title('Ratio of $MSE_{post}$ and $MSE_{pre}$ across cities');
ax.add_artist(AnnotationBbox(OffsetImage(plt.imread('fig/miami.png'), zoom=0.25), (2.7, 1.7), frameon=False));

Распределение коэффициентов среднеквадратической ошибки до и после исследования по городам


Действительно, статистика выглядит для Майами довольно кардинально, поэтому маловероятно, чтобы наблюдаемый эффект был обусловлен шумом.


Заключение


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


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


Метод относительно новый, его производные методы появляются каждый год. Среди них примечательны обобщенный синтетический контроль (generalized synthetic control) Сюй (2017), синтетический метод сравнения разностей (synthetic difference-in-differences) Дудченко и Имбенс (2017), пенализированный синтетический контроль (penalized synthetic control) Абади и Лёр (2020), а также методы завершения матрицы (matrix completion methods) Эфи и соавт. (2021). В заключение отмечу, что, если вы хотите услышать объяснение метода из уст его авторов, на Youtube можно найти замечательную лекцию Альберто Абади в NBER Summer Institute.



Ссылки

[1] A. Abadie, J. Gardeazabal, The Economic Costs of Conflict: A Case Study of the Basque Country (2003), The American Economic Review.


[2] A. Abadie, A. Diamond, J. Hainmueller, Synthetic Control Methods for Comparative Case Studies: Estimating the Effect of California’s Tobacco Control Program (2010), Journal of the American Statistical Association.


[3] A. Abadie, Using Synthetic Controls: Feasibility, Data Requirements, and Methodological Aspects (2021), Journal of Economic Perspectives.


[4] N. Doudchenko, G. Imbens, Balancing, Regression, Difference-In-Differences and Synthetic Control Methods: A Synthesis (2017), working paper.


[5] Y. Xu, Generalized Synthetic Control Method: Causal Inference with Interactive Fixed Effects Models (2018), Political Analysis.


[6] A. Abadie, J. L’Hour, A Penalized Synthetic Control Estimator for Disaggregated Data (2020), Journal of the American Statistical Association.


[7] S. Athey, M. Bayati, N. Doudchenko, G. Imbens, K. Khosravi, Matrix Completion Methods for Causal Panel Data Models (2021), Journal of the American Statistical Association.


Другие статьи по теме



Данные



Научим вас аккуратно работать с данными, чтобы вы прокачали карьеру и стали востребованным IT-специалистом:



Теги:
Хабы:
+1
Комментарии 1
Комментарии Комментарии 1

Публикации

Информация

Сайт
www.skillfactory.ru
Дата регистрации
Дата основания
Численность
501–1 000 человек
Местоположение
Россия
Представитель
Skillfactory School