Publikacje naukowe · Wnioskowanie przyczynowe

Quasi-eksperyment i metoda różnicy w różnicach (DiD): założenia, regresja i opis wyników

Jak ocenić efekt programu, gdy nie możesz losować: rodzaje schematów quasi-eksperymentalnych, logika różnicy w różnicach, równoległe trendy, regresja z interakcją, błędy klastrowane, model zdarzeń i test placebo – na jednym przykładzie ze szkół, z kodem R i wzorem opisu.

Strona główna / Blog / Różnica w różnicach (DiD)
W skrócie: Metoda różnicy w różnicach (DiD) szacuje efekt interwencji jako różnicę między zmianą wyniku w grupie z interwencją a zmianą w grupie porównawczej. Usuwa stałe różnice między grupami i wspólny trend, ale wymaga założenia, że bez interwencji obie grupy zmieniałyby się równolegle. Sprawdź trendy z kilku okresów przed interwencją, licz błędy standardowe klastrowane na poziomie, na którym przydzielono interwencję, i formułuj wniosek przyczynowy razem z jego założeniem.

Gdy nie możesz losować: po co quasi-eksperyment

Program profilaktyczny trafia do szkół, które same się zgłosiły. Nowa procedura obowiązuje od września na jednym oddziale szpitala, a na innym nie. Ustawa zmienia zasady egzaminów w całym kraju. W żadnej z tych sytuacji nie decydujesz, kto dostanie interwencję, a mimo to ktoś pyta: czy to zadziałało? Eksperyment z randomizacją jest wykluczony, a proste porównanie „przed i po” albo „z programem i bez” prawie zawsze wprowadza w błąd.

Tu wchodzą schematy quasi-eksperymentalne: plany, w których interwencja jest wyraźnie określona w czasie i w grupach, ale przydział do niej nie jest losowy. Definicję i podstawowe odmiany opisuje hasło schemat quasi-eksperymentalny. Ten wpis jest praktyczny. Przechodzimy przez jeden z najczęściej używanych schematów, czyli metodę różnicy w różnicach (ang. difference-in-differences, DiD), od logiki i założeń po regresję, błędy standardowe, sprawdzenie trendów i wzór opisu w artykule. Wszystko na jednym przykładzie policzonym w R.

Wing i in. (2018) piszą wprost, że DiD nie zastępuje w pełni eksperymentu z randomizacją, ale często jest wykonalnym sposobem uczenia się o związkach przyczynowych tam, gdzie eksperyment byłby niewykonalny albo nieetyczny. Siła wniosku zależy od tego, jak starannie zaprojektujesz porównanie, a nie tylko od modelu statystycznego.

Rodzaje schematów quasi-eksperymentalnych

Harris i in. (2006) proponują hierarchię planów quasi-eksperymentalnych i zachęcają do wybierania planów z jej wyższych szczebli, bo dają mocniejsze dowody przyczynowe. W praktyce oznacza to zwykle dodanie grupy porównawczej i kilku pomiarów przed interwencją. Klasyczny podręcznik tej rodziny planów to praca Shadisha, Cooka i Campbella (2002). W praktyce badań psychologicznych i edukacyjnych spotkasz najczęściej cztery schematy.

Najczęstsze schematy quasi-eksperymentalne: struktura, kluczowe założenie i typowe zastosowanie
SchematStruktura danychKluczowe założeniePrzykład
Grupa nierównoważna z pretestem i posttestemDwie grupy, pomiar przed i poGrupy zmieniałyby się tak samo bez interwencjiKlasy z programem i bez programu
Różnica w różnicach (DiD)Grupy × okresy, często wiele okresów przed i poRównoległe trendy przy braku interwencjiSzkoły, które wdrożyły program, i szkoły porównawcze
Przerwany szereg czasowy (ITS)Długi szereg czasowy z wyraźnym momentem interwencjiTrend sprzed interwencji przedłużyłby się bez niejMiesięczna liczba zgłoszeń do poradni przed i po kampanii
Regresja nieciągła (RD)Przydział według progu zmiennej przydziałuTuż przy progu grupy różnią się tylko interwencjąZajęcia wyrównawcze dla osób poniżej progu punktowego

Przerwany szereg czasowy to schemat, który pozwala ocenić efekt interwencji na podstawie danych podłużnych (Kontopantelis i in., 2015). Zbierasz wiele pomiarów przed i po, a efekt widać jako zmianę poziomu albo nachylenia trendu. Dodanie do szeregu grupy porównawczej zbliża go do DiD. Regresja nieciągła wykorzystuje regułę przydziału: interwencję dostaje się wtedy, gdy wartość obserwowanej zmiennej leży po jednej stronie ustalonego progu (Imbens i Lemieux, 2008). Wnioski z RD dotyczą przede wszystkim osób w pobliżu progu. W tym wpisie RD i ITS tylko sygnalizujemy, a dalej zajmujemy się DiD.

Jeśli masz jedną grupę z pomiarem przed i po, zacznij od wpisu ANCOVA i analiza badania interwencyjnego przed i po. Opisuje on także, czym różni się analiza zmian od ANCOVA w grupach nierandomizowanych.

Logika różnicy w różnicach

Pomysł jest prosty. W grupie z interwencją widzisz zmianę wyniku między okresem „przed” a „po”. Ta zmiana składa się z efektu interwencji i ze wszystkiego, co i tak by się wydarzyło: wspólnego trendu, zmian w szkołach, sezonu, zdarzeń zewnętrznych. Grupa porównawcza, która interwencji nie dostała, pokazuje, jak duża byłaby zmiana bez niej. Odejmujesz jedną zmianę od drugiej:

DiD = (MI, po − MI, przed) − (MK, po − MK, przed)

Tu I oznacza grupę z interwencją, a K – grupę porównawczą. Pierwszy nawias to zmiana w grupie z programem, drugi – zmiana, której spodziewalibyśmy się w tej grupie bez programu. Stałe różnice poziomu między grupami (np. szkoły z programem mają zawsze wyższy stres) znoszą się, bo każda grupa jest porównywana sama ze sobą. Nie znoszą się natomiast różnice w tempie zmian. Stąd najważniejsze założenie metody.

Założenie równoległych trendów: gdyby interwencji nie było, średnie w obu grupach zmieniałyby się równolegle. To założenie dotyczy sytuacji, której nie obserwujemy (kontrfaktu), więc nie da się go udowodnić. Można je uprawdopodobnić: argumentami merytorycznymi i danymi z kilku okresów sprzed interwencji. Kahn-Lang i Lang (2020) dodają dwa wymagania, które łatwo pominąć. Po pierwsze, wyjaśnij, dlaczego grupy różniły się na starcie i dlaczego ta różnica nie miałaby wpływać na trendy. Po drugie, uzasadnij skalę pomiaru: trendy równoległe w punktach surowych nie muszą być równoległe po logarytmowaniu i odwrotnie.

Jak dobrać grupę porównawczą

W DiD grupa porównawcza nie musi być podobna do grupy z interwencją pod względem poziomu wyniku. Musi być podobna pod względem tego, jak wynik zmieniałby się w czasie. To inne kryterium niż w zwykłym dopasowaniu grup i warto je mieć z tyłu głowy już przy planowaniu badania.

  • Ten sam kontekst zewnętrzny. Szkoły z tego samego regionu i typu przechodzą przez te same terminy egzaminów, zmiany przepisów i sezonowe wahania. Szkoły z innego województwa mogą mieć własne zdarzenia, które złamią równoległość.
  • Brak kontaktu z interwencją. Grupa porównawcza nie powinna dostać „kawałka” programu przez wspólnych nauczycieli, materiały czy szkolenia.
  • Ten sam pomiar. To samo narzędzie, te same terminy i ta sama procedura w obu grupach. Zmiana narzędzia tylko w jednej grupie wygląda w danych dokładnie jak efekt.
  • Uzasadnienie wyboru zapisane przed analizą. Jeśli masz kilka kandydatów na grupę porównawczą, wybierz ją według kryteriów merytorycznych, a nie według tego, która daje „ładniejszy” wynik.

Różnice w cechach sprzed interwencji (np. odsetek uczniów z dysleksją, wielkość szkoły) opisz w tabeli z standaryzowaną różnicą średnich. Same różnice poziomu nie przekreślają DiD, ale cechy, które mogą wpływać na tempo zmian, są potencjalnymi zmiennymi zakłócającymi. Można je uwzględnić w modelu jako zmienne kontrolne albo pokazać analizę w podgrupach podobnych szkół.

Często pada pytanie, czy zamiast DiD nie wystarczy ANCOVA z pomiarem wyjściowym jako kowariantem. Te dwie analizy opierają się na różnych założeniach. DiD zakłada, że bez interwencji różnica między grupami pozostałaby stała. ANCOVA zakłada, że po uwzględnieniu wyniku wyjściowego grupy byłyby porównywalne. W eksperymencie z randomizacją oba założenia są zwykle spełnione. Przy grupach dobranych nielosowo mogą dać różne odpowiedzi i wtedy wybór trzeba uzasadnić merytorycznie, a nie wynikiem.

Przykład: program profilaktyki stresu egzaminacyjnego w szkołach

W przykładzie 24 licea przez sześć semestrów mierzyły stres egzaminacyjny uczniów na skali 10–50. Dwanaście szkół wdrożyło od czwartego semestru program profilaktyczny, dwanaście nie. W każdej szkole w każdym semestrze ankietę wypełniało 25 innych uczniów, więc dane to powtarzane przekroje, a nie panel tych samych osób. Razem 3600 obserwacji. Dane są symulowane, ale z dwoma cechami typowymi dla prawdziwych wdrożeń:

  • do programu zgłosiły się szkoły, w których stres był wyższy już na starcie (selekcja);
  • w całej populacji stres rośnie z semestru na semestr, bo zbliża się matura (wspólny trend).

W symulacji znamy prawdę: program obniża stres o 2.5 punktu. Dzięki temu widać, która metoda trafia, a która nie. Plik CSV z danymi pobierzesz w sekcji z kodem.

Krok 1. Tabela 2 × 2 i trzy błędne odpowiedzi

Zacznij od średnich w czterech komórkach: grupa × okres (semestry 1–3 to „przed”, 4–6 to „po”).

Średni stres egzaminacyjny w szkołach z programem i porównawczych przed i po wdrożeniu programu
GrupaPrzed (sem. 1–3)Po (sem. 4–6)Zmiana
Szkoły z programem31.1630.84−0.32
Szkoły porównawcze26.3528.201.86
Różnica w różnicach−2.18

Z tej samej tabeli można wyczytać trzy różne „efekty”, z których tylko jeden ma sens:

  • Porównanie tylko po interwencji: w szkołach z programem stres jest o 2.64 punktu wyższy. Program wygląda na szkodliwy, bo porównanie miesza efekt programu z różnicą, z którą szkoły do niego weszły.
  • Przed–po tylko w szkołach z programem: spadek o 0.32 punktu, czyli „prawie nic”. Ta liczba miesza efekt programu ze wspólnym wzrostem stresu przed maturą.
  • Różnica w różnicach: w szkołach porównawczych stres wzrósł o 1.86 punktu, a w szkołach z programem spadł o 0.32. Różnica zmian to −2.18 punktu, blisko prawdziwego efektu −2.5.
Cztery oszacowania efektu programu z 95% przedziałami ufności na tle prawdziwego efektu −2.5: porównanie tylko po interwencji 2.64 [1.14, 4.13], przed–po w szkołach z programem −0.32 [−1.30, 0.67], DiD ze zwykłymi błędami −2.18 [−3.13, −1.22] i DiD z błędami klastrowanymi CR2 −2.18 [−3.74, −0.61]
Rysunek 1. Ten sam program oceniony czterema sposobami. Porównanie tylko po interwencji i porównanie przed–po w jednej grupie mijają się z prawdziwym efektem (linia przerywana), DiD trafia blisko niego. Dwa dolne oszacowania różnią się tylko błędem standardowym: przy uwzględnieniu klastrowania po szkołach przedział ufności jest szerszy. Przedziały dla dwóch górnych oszacowań liczono z błędami klastrowanymi CR2. Obliczenia: R (dane symulowane).

Rysunek 1 pokazuje też drugą lekcję: to samo oszacowanie DiD może mieć różne przedziały ufności. Do tego wrócimy w kroku 4. W jednostkach odchylenia standardowego wyniku sprzed programu (SD = 7.79) efekt wynosi −0.28. To użyteczna, choć przybliżona miara, którą możesz zestawić z innymi badaniami (zob. standaryzowana różnica średnich).

Krok 2. Sprawdź trendy przed interwencją na wykresie

Zanim policzysz jakikolwiek model, narysuj średnie w każdym okresie osobno dla obu grup. Wing i in. (2018) zalecają aktywne projektowanie badania DiD: dobór grupy porównawczej, analizy wrażliwości i sprawdziany odporności, które pomagają uzasadnić założenia. Wykres trendów to najprostszy z nich.

Średni stres w sześciu semestrach: w szkołach z programem 30.24, 30.94, 32.30, potem 29.69, 31.15, 31.68; w szkołach porównawczych 26.04, 25.83, 27.17, potem 28.26, 28.13, 28.23; przerywana linia kontrfaktu dla szkół z programem leży około 33 punktów
Rysunek 2. Średni stres egzaminacyjny w kolejnych semestrach z 95% przedziałami ufności liczonymi z 12 średnich szkolnych w każdej grupie. Szare tło to okres po wdrożeniu programu. Czerwona linia przerywana pokazuje kontrfakt: przebieg w szkołach z programem, gdyby po semestrze 3 zmieniały się jak szkoły porównawcze, z zachowaniem średniej różnicy sprzed programu (4.81 punktu). Obliczenia: R (dane symulowane).

Przed programem obie linie biegną podobnie. W szkołach z programem średnie wynosiły 30.24, 30.94 i 32.30, a w porównawczych 26.04, 25.83 i 27.17. Różnica poziomów (średnio 4.81 punktu) jest duża, ale DiD jej nie potrzebuje znosić – wystarczy, że jest stała. Czerwona linia przerywana to kontrfakt: gdzie byłyby szkoły z programem, gdyby zmieniały się jak szkoły porównawcze. Odległość między nią a niebieską linią to efekt programu w kolejnych semestrach.

Z wykresem trendów wiążą się dwie pułapki. Po pierwsze, trzy punkty to mało, żeby ocenić równoległość, a przedziały ufności są szerokie. Po drugie, równoległe trendy przed interwencją są dla kontrfaktu tylko przesłanką: Kahn-Lang i Lang (2020) podkreślają, że nie są ani warunkiem koniecznym, ani wystarczającym. Coś, co wydarzyło się w szkołach z programem równocześnie z jego wdrożeniem (np. zmiana dyrekcji), złamie założenie, nawet jeśli wcześniejsze trendy były idealnie równoległe.

Krok 3. Regresja z interakcją: oszacowanie DiD

Tabelę 2 × 2 można zapisać jako regresję liniową z dwiema zmiennymi zero-jedynkowymi i ich interakcją:

stres = b0 + b1 × program + b2 × po + b3 × (program × po) + e
  • b0 = 26.35 – średnia w szkołach porównawczych przed programem;
  • b1 = 4.81 – różnica między grupami przed programem (selekcja);
  • b2 = 1.86 – zmiana w szkołach porównawczych (wspólny trend);
  • b3 = −2.18 – oszacowanie DiD, czyli dodatkowa zmiana w szkołach z programem.

Regresja daje to samo co tabela, ale pozwala dodać zmienne kontrolne, policzyć poprawne błędy standardowe i rozszerzyć model na wiele okresów. Przy wielu okresach zwykle zastępuje się „program” i „po” efektami stałymi jednostek (tu: szkół) i okresów (tu: semestrów). To tzw. model z dwukierunkowymi efektami stałymi (ang. two-way fixed effects, TWFE). W naszych zrównoważonych danych daje on dokładnie to samo oszacowanie, −2.18.

Ostrożnie ze zmiennymi kontrolnymi. Dodawaj cechy zmierzone przed interwencją albo takie, na które program nie mógł wpłynąć. Kontrolowanie zmiennej, którą program zmienia (np. liczby godzin zajęć dodatkowych), może zabrać część efektu.

Uwaga na schematy, w których jednostki wchodzą do programu w różnych momentach. Goodman-Bacon (2021) pokazał, że wtedy estymator TWFE jest średnią ważoną wszystkich porównań „dwie grupy × dwa okresy”, także porównań jednostek leczonych wcześniej z leczonymi później, i jest obciążony, gdy efekt zmienia się w czasie. Roth i in. (2023) porządkują nowsze metody, które rozluźniają kanoniczne założenia DiD: dotyczące zróżnicowanego momentu wdrożenia, możliwych naruszeń równoległych trendów i wnioskowania. Przy wdrożeniu „falami” sięgnij po te metody zamiast prostego TWFE.

Krok 4. Błędy standardowe klastrowane po szkołach

Program przydzielono szkołom, nie uczniom. Uczniowie z tej samej szkoły dzielą nauczycieli, terminy sprawdzianów i lokalne zdarzenia, więc ich wyniki są skorelowane. Zwykła regresja tego nie wie i traktuje 3600 uczniów jak 3600 niezależnych informacji. Efekt: za małe błędy standardowe, za wąskie przedziały ufności i za dużo „istotnych” wyników. Cameron i Miller (2015) pokazują, że w danych pogrupowanych w klastry domyślne błędy standardowe mogą znacznie zawyżać precyzję, a przy dużej liczbie klastrów wnioskowanie powinno opierać się na błędach odpornych na klastrowanie.

Problem jest szczególnie poważny w DiD z wieloma okresami. Bertrand i in. (2004) w symulacji z fikcyjnymi ustawami na prawdziwych danych stanowych otrzymali „efekt” istotny na poziomie 5% aż dla 45% interwencji, które nie miały żadnego efektu. Przyczyną były błędy standardowe ignorujące korelację wyników w czasie.

Oszacowanie DiD z trzema rodzajami błędów standardowych
Błąd standardowySE95% CITest
Zwykły (zakłada niezależność uczniów)0.49[−3.13, −1.22]t(3596) = −4.47, p < .001
Klastrowany po szkołach (CR1)0.74[−3.62, −0.73]p = .003
Klastrowany CR2 z poprawką Satterthwaite’a0.76[−3.74, −0.61]t(22) = −2.88, p = .009

Błąd klastrowany jest 1.52 raza większy od zwykłego. Wniosek się nie zmienia, ale przy słabszym efekcie mógłby. Przy 24 klastrach warto użyć poprawki dla małej liczby klastrów: wariantu CR2 z testem o stopniach swobody według Satterthwaite’a (pakiet clubSandwich). Liczba stopni swobody, 22, mówi wprost, że informację niesie 24 szkół, a nie 3600 uczniów. Gdy klastrów jest bardzo mało (np. kilka szkół), żadna poprawka nie uratuje wnioskowania. Wtedy zaplanuj więcej jednostek albo inny schemat. Ten sam problem przy planowaniu liczebności opisuje hasło efekt schematu, a modelowanie zagnieżdżenia – wpis model wielopoziomowy krok po kroku.

Krok 5. Model zdarzeń i test placebo

Wykres trendów warto uzupełnić formalnym sprawdzeniem. W modelu zdarzeń (ang. event study) zamiast jednej interakcji „program × po” szacujesz osobną różnicę dla każdego semestru, względem ostatniego semestru przed programem. Współczynniki dla semestrów przed programem powinny być bliskie zera. Współczynniki po programie pokazują, jak efekt rozkłada się w czasie.

Współczynniki modelu zdarzeń z 95% przedziałami ufności CR2: semestr 1 −0.93, semestr 2 −0.02, semestr 3 odniesienie 0, semestr 4 −3.70, semestr 5 −2.10, semestr 6 −1.67
Rysunek 3. Model zdarzeń: różnica między szkołami z programem i porównawczymi w każdym semestrze względem semestru 3 (ostatniego przed programem), z 95% przedziałami ufności z błędami klastrowanymi CR2. Współczynniki sprzed programu (szare) bliskie zera wspierają założenie równoległych trendów, ale ich przedziały są szerokie. Obliczenia: R, pakiet clubSandwich (dane symulowane).

Przed programem różnice względem semestru 3 wynosiły −0.93, 95% CI [−3.57, 1.71], i −0.02, 95% CI [−2.10, 2.07]. Łączny test obu współczynników nie wskazał na różnicę trendów, F(2, 21) = 0.30, p = .742. Po wdrożeniu efekt wyniósł −3.70 w pierwszym semestrze, 95% CI [−5.88, −1.51], i −2.10 oraz −1.67 w kolejnych, z przedziałami obejmującymi zero. Pojedyncze semestry są oszacowane mniej precyzyjnie niż efekt uśredniony, dlatego nie wyciągaj wniosku, że program „przestał działać”.

Test placebo to drugi sprawdzian: bierzesz tylko dane sprzed programu i udajesz, że program zaczął się wcześniej (tu: w semestrze 3). Prawdziwego efektu tam nie ma, więc oszacowanie powinno być bliskie zera. W przykładzie wyniosło 0.47, SE = 0.97, t(22) = 0.49, p = .630.

Wynik nieistotny w teście trendów to jednak słaby argument. Kahn-Lang i Lang (2020) ostrzegają przed traktowaniem braku istotności różnicy trendów jako dowodu jej braku. Przy trzech semestrach i 24 szkołach test ma małą moc, a przedziały ufności dla współczynników sprzed programu są szerokie (od około −3.6 do 2.1). Lepiej pokazać te przedziały i zapytać, czy różnica trendów tej wielkości podważałaby wniosek. Formalne podejście do tego pytania to test równoważności albo analiza wrażliwości na naruszenia równoległych trendów.

Zagrożenia trafności wniosków z DiD

Campbell (1957) opisał zmienne uboczne, które zagrażają trafności wewnętrznej badań w warunkach naturalnych: historię, dojrzewanie, efekt testowania, zmianę narzędzia, regresję, selekcję i ubytek osób. DiD dobrze radzi sobie ze stałymi różnicami między grupami i z tym, co wspólne dla obu grup. Słabo radzi sobie z tym, co dotyczy tylko jednej z nich. Antonakis i in. (2010) wymieniają DiD wśród metod, które pozwalają testować hipotezy przyczynowe bez randomizacji. W ich przeglądzie artykułów o przywództwie badacze nie uwzględniali jednak od 66% do 90% warunków, od których zależy trafność wniosków przyczynowych.

Zagrożenia trafności w metodzie różnicy w różnicach i sposoby ich ograniczania
ZagrożenieJak wygląda w DiDCo możesz zrobić
Historia specyficzna dla grupyW szkołach z programem równocześnie zmieniono dyrekcję albo plan lekcjiZbierz informacje o innych zmianach; analiza z wyłączeniem takich jednostek
Selekcja × dojrzewanieSzkoły zgłosiły się, bo stres u nich rósł szybciejKilka okresów przed programem, model zdarzeń, test placebo
Regresja do średniejDo programu weszły szkoły po wyjątkowo złym semestrzeSprawdź, czy wybór zależał od ostatniego pomiaru; dłuższa linia bazowa
Zmiana składu grupPo wdrożeniu programu zmienił się profil uczniów w szkołachPorównaj cechy uczniów przed i po w obu grupach
Zmiana narzędzia lub sposobu pomiaruW szkołach z programem ankietę prowadzą realizatorzy programuJednakowa procedura pomiaru we wszystkich szkołach
Przenikanie interwencjiNauczyciele ze szkół porównawczych korzystają z materiałów programuWybierz grupę porównawczą oddaloną od szkół z programem
Zróżnicowany moment wdrożeniaSzkoły wchodzą do programu w różnych semestrachEstymatory dla wdrożeń „falami” zamiast prostego TWFE (Roth i in., 2023)

Do trafności wewnętrznej dochodzi trafność zewnętrzna. DiD szacuje efekt w grupie, która dostała interwencję. Szkoły, które same się zgłosiły, mogą reagować na program inaczej niż szkoły, którym zostałby narzucony. Dlatego pisz o „efekcie programu w szkołach, które go wdrożyły”, a nie o efekcie programu w ogóle. Przed zebraniem danych zapisz w planie analizy, które okresy są „przed” i „po”, jaką grupę porównawczą wybierasz i jakie testy trendów wykonasz. Wybór tych elementów po obejrzeniu wyników bardzo ułatwia znalezienie „efektu”.

Wzór opisu metody i wyników DiD

Opis powinien pozwolić czytelnikowi ocenić założenia, a nie tylko odczytać liczbę. Podaj: jak grupy trafiły do interwencji, okresy przed i po, model, sposób liczenia błędów standardowych, wynik testów trendów i ostrożny wniosek przyczynowy.

Efekt programu oszacowano metodą różnicy w różnicach. Porównano 12 szkół, które od czwartego semestru wdrożyły program profilaktyki stresu egzaminacyjnego, z 12 szkołami, które go nie wdrożyły; szkoły same zgłosiły się do programu. Stres egzaminacyjny (10–50) mierzono w sześciu semestrach na niezależnych próbach 25 uczniów w każdej szkole (N = 3600). Zastosowano regresję liniową z efektami stałymi szkół i semestrów; błędy standardowe klastrowano po szkołach (CR2 z poprawką Satterthwaite’a). Przed programem stres był wyższy w szkołach, które do niego przystąpiły (różnica 4.81 punktu), ale trendy w obu grupach nie różniły się: współczynniki modelu zdarzeń dla semestrów 1 i 2 wynosiły −0.93, 95% CI [−3.57, 1.71], i −0.02, 95% CI [−2.10, 2.07], F(2, 21) = 0.30, p = .742, a test placebo z fikcyjnym początkiem programu w semestrze 3 dał oszacowanie 0.47, SE = 0.97, p = .630. W szkołach porównawczych stres wzrósł o 1.86 punktu, a w szkołach z programem spadł o 0.32 punktu. Oszacowanie różnicy w różnicach wyniosło −2.18 punktu, 95% CI [−3.74, −0.61], t(22) = −2.88, p = .009, co odpowiada 0.28 odchylenia standardowego wyniku sprzed programu. Przy założeniu, że bez programu trendy w obu grupach byłyby równoległe, wynik wskazuje, że program obniżył stres egzaminacyjny w szkołach, które go wdrożyły.

Do opisu dołącz rysunek trendów i wykres modelu zdarzeń, najlepiej jako jeden panel. Recenzenci prawie zawsze pytają o te dwa elementy. Jeśli potrzebujesz pomocy w doborze grupy porównawczej, w modelu z klastrami albo w odpowiedzi na uwagi recenzenta, zajrzyj do oferty analiz dla badaczy.

Przykład reprodukowalny

Różnica w różnicach w R: kod i wynik

Trzy przepisy uruchamiasz po kolei w jednej sesji R. Pierwszy generuje dane symulowane i liczy tabelę 2 × 2, drugi i trzeci korzystają z obiektu dane. Liczby w tekście, tabelach i na rysunkach pochodzą z tych obliczeń. Dane pobierzesz jako plik roznica-w-roznicach-dane.csv (3600 wierszy; kolumny: szkola, program, fala, po, stres). Podstawy regresji z interakcją znajdziesz we wpisie regresja wieloraka krok po kroku.

Dane i tabela 2 × 2

Dane wejściowe: 24 szkoły × 6 semestrów × 25 uczniów, program w 12 szkołach od semestru 4 (dane symulowane, set.seed(5320)).

Co odczytać: średnie w czterech komórkach, trzy proste oszacowania (tylko po, przed–po, różnica w różnicach) oraz SD wyniku sprzed programu i standaryzowany efekt.

R
options(width = 110)

# Dane symulowane: program profilaktyki stresu egzaminacyjnego w liceach.
# 24 szkoły: 12 wdrożyło program od 4. semestru pomiaru (grupa programu), 12 nie (grupa porównawcza).
# W każdej szkole w każdym z 6 semestrów ankietę wypełnia inna próba 25 uczniów (przekroje powtarzane).
# Wynik: skala stresu egzaminacyjnego 10–50 (więcej = silniejszy stres).
# Szkoły same zgłosiły się do programu, bo stres był u nich wyższy (+3 pkt na starcie).
# Wspólny trend: stres rośnie o 0.6 pkt na semestr. Prawdziwy efekt programu: −2.5 pkt.
set.seed(5320)
szkoly <- data.frame(szkola = sprintf("S%02d", 1:24), program = rep(1:0, each = 12),
                     efekt_szkoly = rnorm(24, sd = 2))
siatka <- merge(szkoly, data.frame(fala = 1:6))
siatka$szok <- rnorm(nrow(siatka), sd = 1.5)                   # wspólne wahania szkoły w danym semestrze
dane <- siatka[rep(seq_len(nrow(siatka)), each = 25), ]
dane$po <- as.integer(dane$fala >= 4)                          # okres po wdrożeniu programu
dane$stres <- with(dane, 27 + 3 * program + 0.6 * (fala - 1) + efekt_szkoly + szok - 2.5 * program * po +
                     rnorm(nrow(dane), sd = 7))
dane$stres <- round(pmin(pmax(dane$stres, 10), 50))
dane <- dane[, c("szkola", "program", "fala", "po", "stres")]
rownames(dane) <- NULL
c(uczniowie = nrow(dane), szkoly = length(unique(dane$szkola)))

# 1. Tabela 2 × 2: średnie przed i po w obu grupach
srednie <- with(dane, tapply(stres, list(grupa = ifelse(program == 1, "program", "porownawcza"),
                                         okres = ifelse(po == 1, "po", "przed")), mean))
srednie <- srednie[c("program", "porownawcza"), c("przed", "po")]
round(srednie, 2)

# 2. Trzy proste oszacowania „efektu” – tylko jedno ma sens
zmiana_program     <- srednie["program", "po"] - srednie["program", "przed"]
zmiana_porownawcza <- srednie["porownawcza", "po"] - srednie["porownawcza", "przed"]
round(c(tylko_po_porownanie_grup = srednie["program", "po"] - srednie["porownawcza", "po"],
        przed_po_tylko_program   = zmiana_program,
        zmiana_w_grupie_porown   = zmiana_porownawcza,
        roznica_w_roznicach      = zmiana_program - zmiana_porownawcza), 2)

# 3. Odchylenie standardowe wyniku przed programem (do standaryzacji efektu)
sd_przed <- sd(dane$stres[dane$po == 0])
round(c(SD_przed = sd_przed, d_DiD = (zmiana_program - zmiana_porownawcza) / sd_przed), 2)
Wynik w R
uczniowie    szkoly 
     3600        24 
             okres
grupa         przed    po
  program     31.16 30.84
  porownawcza 26.35 28.20
tylko_po_porownanie_grup   przed_po_tylko_program   zmiana_w_grupie_porown      roznica_w_roznicach 
                    2.64                    -0.32                     1.86                    -2.18 
SD_przed    d_DiD 
    7.79    -0.28

Regresja z interakcją i błędy standardowe klastrowane

Dane wejściowe: obiekt dane z poprzedniego przepisu.

Co odczytać: współczynnik program:po ze zwykłym SE, z SE klastrowanym (CR1) i CR2 z testem Satterthwaite’a, iloraz błędów standardowych, 95% CI oraz ten sam efekt w modelu z efektami stałymi szkół i semestrów.

R
# Regresja DiD z interakcją, zwykłe i klastrowane błędy standardowe
# Wymaga obiektu dane z b53-1-dane-2x2.R
suppressPackageStartupMessages({
  library(sandwich)       # vcovCL(): klastrowane błędy standardowe
  library(lmtest)         # coeftest(), coefci()
  library(clubSandwich)   # CR2 z poprawką małej liczby klastrów
})

# Model 1: stres = b0 + b1·program + b2·po + b3·(program × po); b3 = oszacowanie DiD
m1 <- lm(stres ~ program * po, data = dane)
coeftest(m1)                                               # zwykłe SE (błędnie zakładają niezależność uczniów)
coeftest(m1, vcov = vcovCL(m1, cluster = ~ szkola))        # SE klastrowane po szkołach (CR1)
coef_test(m1, vcov = "CR2", cluster = dane$szkola, test = "Satterthwaite")

# Porównanie błędów standardowych i 95% CI dla interakcji program × po
se_zwykle <- sqrt(diag(vcov(m1)))["program:po"]
se_klastr <- sqrt(diag(vcovCL(m1, cluster = ~ szkola)))["program:po"]
round(c(b3 = unname(coef(m1)["program:po"]), SE_zwykle = unname(se_zwykle), SE_klastrowane = unname(se_klastr),
        iloraz = unname(se_klastr / se_zwykle)), 3)
round(coefci(m1, parm = "program:po"), 2)                              # CI zwykłe
round(coefci(m1, parm = "program:po", vcov. = vcovCL(m1, cluster = ~ szkola)), 2)  # CI klastrowane
ci_cr2 <- conf_int(m1, vcov = "CR2", cluster = dane$szkola, coefs = "program:po")
ci_cr2

# Model 2: efekty stałe szkół i semestrów (two-way fixed effects)
m2 <- lm(stres ~ I(program * po) + factor(szkola) + factor(fala), data = dane)
coef_test(m2, vcov = "CR2", cluster = dane$szkola, test = "Satterthwaite", coefs = "I(program * po)")
conf_int(m2, vcov = "CR2", cluster = dane$szkola, coefs = "I(program * po)")
Wynik w R

t test of coefficients:

            Estimate Std. Error  t value  Pr(>|t|)    
(Intercept) 26.34556    0.24335 108.2612 < 2.2e-16 ***
program      4.81222    0.34415  13.9829 < 2.2e-16 ***
po           1.85778    0.34415   5.3981 7.169e-08 ***
program:po  -2.17556    0.48670  -4.4700 8.064e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


t test of coefficients:

            Estimate Std. Error t value  Pr(>|t|)    
(Intercept) 26.34556    0.75148 35.0584 < 2.2e-16 ***
program      4.81222    0.98389  4.8910 1.047e-06 ***
po           1.85778    0.59463  3.1242  0.001797 ** 
program:po  -2.17556    0.73854 -2.9457  0.003243 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Alternative hypothesis: two-sided 
       Coef. Estimate    SE Null value t-stat d.f. (Satt) p-val (Satt) Sig.
 (Intercept)    26.35 0.768          0  34.30          11      < 0.001  ***
     program     4.81 1.006          0   4.79          22      < 0.001  ***
          po     1.86 0.608          0   3.06          11      0.01091    *
  program:po    -2.18 0.755          0  -2.88          22      0.00865   **
            b3      SE_zwykle SE_klastrowane         iloraz 
        -2.176          0.487          0.739          1.517 
           2.5 % 97.5 %
program:po -3.13  -1.22
           2.5 % 97.5 %
program:po -3.62  -0.73
      Coef. Estimate    SE d.f. Lower 95% CI Upper 95% CI
 program:po    -2.18 0.755   22        -3.74        -0.61
Alternative hypothesis: two-sided 
           Coef. Estimate    SE Null value t-stat d.f. (Satt) p-val (Satt) Sig.
 I(program * po)    -2.18 0.755          0  -2.88          22      0.00865   **
           Coef. Estimate    SE d.f. Lower 95% CI Upper 95% CI
 I(program * po)    -2.18 0.755   22        -3.74        -0.61

Model zdarzeń, test trendów i test placebo

Dane wejściowe: obiekt dane z pierwszego przepisu (pakiet clubSandwich wczytany w drugim).

Co odczytać: średnie w każdym semestrze, współczynniki pf1–pf6 z 95% CI, łączny test współczynników sprzed programu (HTZ) i oszacowanie placebo.

R
# Sprawdzenie trendów przed programem: model zdarzeń (event study) i test placebo
# Wymaga obiektu dane z b53-1-dane-2x2.R oraz pakietu clubSandwich

# Średnie w każdym semestrze i grupie
round(with(dane, tapply(stres, list(fala = fala, program = program), mean)), 2)

# Model zdarzeń: osobny efekt „program × semestr”, semestr 3 (ostatni przed programem) = odniesienie
for (k in c(1, 2, 4, 5, 6)) dane[[paste0("pf", k)]] <- as.integer(dane$program == 1 & dane$fala == k)
m3 <- lm(stres ~ pf1 + pf2 + pf4 + pf5 + pf6 + factor(szkola) + factor(fala), data = dane)
es <- conf_int(m3, vcov = "CR2", cluster = dane$szkola, coefs = c("pf1", "pf2", "pf4", "pf5", "pf6"))
es

# Łączny test: czy przed programem różnice trendów są zerowe? (pf1 = pf2 = 0)
Wald_test(m3, constraints = constrain_zero(c("pf1", "pf2")), vcov = "CR2", cluster = dane$szkola)

# Test placebo: tylko semestry 1–3, „fikcyjny program” od semestru 3
przed <- subset(dane, fala <= 3)
przed$po_placebo <- as.integer(przed$fala == 3)
m4 <- lm(stres ~ I(program * po_placebo) + factor(szkola) + factor(fala), data = przed)
coef_test(m4, vcov = "CR2", cluster = przed$szkola, test = "Satterthwaite", coefs = "I(program * po_placebo)")
Wynik w R
    program
fala     0     1
   1 26.04 30.24
   2 25.83 30.94
   3 27.17 32.30
   4 28.26 29.69
   5 28.13 31.15
   6 28.23 31.68
 Coef. Estimate   SE d.f. Lower 95% CI Upper 95% CI
   pf1  -0.9267 1.27   22        -3.57        1.714
   pf2  -0.0167 1.01   22        -2.10        2.068
   pf4  -3.6967 1.05   22        -5.88       -1.513
   pf5  -2.1000 1.25   22        -4.70        0.499
   pf6  -1.6733 1.13   22        -4.01        0.664
 test Fstat df_num df_denom p_val sig
  HTZ 0.303      2       21 0.742    
Alternative hypothesis: two-sided 
                   Coef. Estimate    SE Null value t-stat d.f. (Satt) p-val (Satt) Sig.
 I(program * po_placebo)    0.472 0.965          0  0.489          22         0.63

Bibliografia oprogramowania

Wyniki na tej stronie pochodzą z uruchomienia pokazanego kodu w R 4.5.3; rysunki przygotowano w pakiecie ggplot2 (zapis SVG: svglite). W pracy podaj wersje faktycznie użytych pakietów (sessionInfo()).

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
  2. sandwich (wersja 3.1.1): Zeileis, A., Köll, S., & Graham, N. (2020). Various versatile variances: An object-oriented implementation of clustered covariances in R. Journal of Statistical Software, 95(1), 1–36. https://doi.org/10.18637/jss.v095.i01
  3. lmtest (wersja 0.9-40): Zeileis, A., & Hothorn, T. (2002). Diagnostic checking in regression relationships. R News, 2(3), 7–10. https://CRAN.R-project.org/doc/Rnews/
  4. clubSandwich (wersja 0.7.0): Pustejovsky, J. E. (2026). clubSandwich: Cluster-robust (sandwich) variance estimators with small-sample corrections [R package]. https://doi.org/10.32614/CRAN.package.clubSandwich
  5. ggplot2 (wersja 4.0.2): Wickham, H. (2016). ggplot2: Elegant graphics for data analysis. Springer. https://ggplot2.tidyverse.org
  6. svglite (wersja 2.2.2): Wickham, H., Henry, L., Pedersen, T. L., Luciani, T. J., Decorde, M., & Lise, V. (2025). svglite: An ‘SVG’ graphics device [R package]. https://doi.org/10.32614/CRAN.package.svglite

Najczęstsze błędy w analizie quasi-eksperymentu

  • Porównanie tylko po interwencji. Przy nielosowym przydziale miesza efekt z różnicami, z którymi grupy weszły do badania. W przykładzie dało przeciwny znak.
  • Przed–po bez grupy porównawczej. Miesza efekt ze wspólnym trendem, sezonem i regresją do średniej.
  • Uznanie nieistotnego testu trendów za dowód równoległości. Pokaż przedziały ufności i oceń, czy różnica w ich granicach podważałaby wniosek.
  • Zwykłe błędy standardowe przy interwencji przydzielonej grupom. Klastruj na poziomie, na którym przydzielono interwencję, i pamiętaj, że liczy się liczba klastrów.
  • Kontrolowanie zmiennych, na które wpływa program. Taka kontrola może zabrać część efektu, który chcesz oszacować.
  • Prosty model TWFE przy wdrożeniu „falami”. Gdy efekt zmienia się w czasie, oszacowanie może być obciążone (Goodman-Bacon, 2021).
  • Zbyt mocny język przyczynowy. Pisz, przy jakim założeniu wynik ma interpretację przyczynową, i nie uogólniaj na jednostki, które same nie wybrałyby interwencji. Więcej o tym w haśle korelacja a przyczynowość.

Najczęstsze pytania

Na czym polega metoda różnicy w różnicach?

Liczysz zmianę wyniku od okresu „przed” do „po” w grupie z interwencją i odejmujesz od niej taką samą zmianę w grupie porównawczej. Stałe różnice między grupami i wspólny trend się znoszą, a reszta jest oszacowaniem efektu. W regresji to współczynnik interakcji grupa × okres. Wynik ma interpretację przyczynową tylko przy założeniu równoległych trendów.

Jak sprawdzić założenie równoległych trendów?

Narysuj średnie obu grup w kilku okresach przed interwencją i oszacuj model zdarzeń, w którym współczynniki sprzed interwencji powinny być bliskie zera. Uzupełnij to testem placebo z fikcyjnym początkiem interwencji. Pamiętaj, że nieistotny test nie dowodzi równoległości – pokaż przedziały ufności i uzasadnij założenie merytorycznie (Kahn-Lang i Lang, 2020).

Dlaczego w DiD stosuje się błędy standardowe klastrowane?

Bo interwencję zwykle przydziela się grupom (szkołom, oddziałom, regionom), a wyniki osób z tej samej grupy są skorelowane w czasie. Zwykłe błędy standardowe zawyżają wtedy precyzję i dają za dużo fałszywie istotnych wyników (Bertrand i in., 2004). Klastruj po jednostce przydziału, a przy kilkudziesięciu klastrach użyj poprawki dla małej liczby klastrów, np. CR2.

Jak zinterpretować współczynnik interakcji w regresji DiD?

Współczynnik przy iloczynie grupa × okres „po” to dodatkowa zmiana wyniku w grupie z interwencją ponad zmianę w grupie porównawczej, w jednostkach zmiennej zależnej. Na przykład −2.18 oznacza, że po wdrożeniu programu stres w szkołach z programem był o 2.18 punktu niższy, niż wynikałoby z trendu w szkołach porównawczych.

Ile pomiarów przed interwencją potrzeba w metodzie DiD?

Formalnie wystarczy jeden okres przed i jeden po, ale wtedy nie da się sprawdzić trendów. Planuj co najmniej dwa–trzy okresy przed interwencją, a najlepiej więcej, bo dopiero one pozwalają narysować trendy, oszacować model zdarzeń i wykonać test placebo.

Powiązane hasła

Przeczytaj też

Oceniasz program, którego nie dało się randomizować?

Pomożemy dobrać grupę porównawczą i model, policzymy DiD z błędami klastrowanymi i testami trendów oraz wyjaśnimy, jakie wnioski przyczynowe wolno z niego wyciągnąć.

Oferta dla badaczyPorozmawiaj o projekcie

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Antonakis, J., Bendahan, S., Jacquart, P., & Lalive, R. (2010). On making causal claims: A review and recommendations. The Leadership Quarterly, 21(6), 1086–1120. https://doi.org/10.1016/j.leaqua.2010.10.010 ● Otwarty dostęp: pełny tekst
  2. Bertrand, M., Duflo, E., & Mullainathan, S. (2004). How much should we trust differences-in-differences estimates? The Quarterly Journal of Economics, 119(1), 249–275. https://doi.org/10.1162/003355304772839588 ● Otwarty dostęp: pełny tekst
  3. Cameron, A. C., & Miller, D. L. (2015). A practitioner’s guide to cluster-robust inference. Journal of Human Resources, 50(2), 317–372. https://doi.org/10.3368/jhr.50.2.317
  4. Campbell, D. T. (1957). Factors relevant to the validity of experiments in social settings. Psychological Bulletin, 54(4), 297–312. https://doi.org/10.1037/h0040950
  5. Goodman-Bacon, A. (2021). Difference-in-differences with variation in treatment timing. Journal of Econometrics, 225(2), 254–277. https://doi.org/10.1016/j.jeconom.2021.03.014
  6. Harris, A. D., McGregor, J. C., Perencevich, E. N., Furuno, J. P., Zhu, J., Peterson, D. E., & Finkelstein, J. (2006). The use and interpretation of quasi-experimental studies in medical informatics. Journal of the American Medical Informatics Association, 13(1), 16–23. https://doi.org/10.1197/jamia.m1749 ● Otwarty dostęp
  7. Imbens, G. W., & Lemieux, T. (2008). Regression discontinuity designs: A guide to practice. Journal of Econometrics, 142(2), 615–635. https://doi.org/10.1016/j.jeconom.2007.05.001
  8. Kahn-Lang, A., & Lang, K. (2020). The promise and pitfalls of differences-in-differences: Reflections on 16 and Pregnant and other applications. Journal of Business & Economic Statistics, 38(3), 613–620. https://doi.org/10.1080/07350015.2018.1546591 ● Otwarty dostęp: pełny tekst
  9. Kontopantelis, E., Doran, T., Springate, D. A., Buchan, I., & Reeves, D. (2015). Regression based quasi-experimental approach when randomisation is not an option: Interrupted time series analysis. BMJ, 350, Article h2750. https://doi.org/10.1136/bmj.h2750 ● Otwarty dostęp
  10. Roth, J., Sant’Anna, P. H. C., Bilinski, A., & Poe, J. (2023). What’s trending in difference-in-differences? A synthesis of the recent econometrics literature. Journal of Econometrics, 235(2), 2218–2244. https://doi.org/10.1016/j.jeconom.2023.03.008 ● Otwarty dostęp: pełny tekst
  11. Shadish, W. R., Cook, T. D., & Campbell, D. T. (2002). Experimental and quasi-experimental designs for generalized causal inference. Houghton Mifflin.
  12. Wing, C., Simon, K., & Bello-Gomez, R. A. (2018). Designing difference in difference studies: Best practices for public health policy research. Annual Review of Public Health, 39(1), 453–469. https://doi.org/10.1146/annurev-publhealth-040617-013507 ● Otwarty dostęp

Cytowania BibTeX

@article{antonakis2010making, author={Antonakis, John and Bendahan, Samuel and Jacquart, Philippe and Lalive, Rafael}, title={{On making causal claims: A review and recommendations}}, journal={The Leadership Quarterly}, year={2010}, volume={21}, number={6}, pages={1086--1120}, doi={10.1016/j.leaqua.2010.10.010}}
@article{bertrand2004how, author={Bertrand, Marianne and Duflo, Esther and Mullainathan, Sendhil}, title={{How much should we trust differences-in-differences estimates?}}, journal={The Quarterly Journal of Economics}, year={2004}, volume={119}, number={1}, pages={249--275}, doi={10.1162/003355304772839588}}
@article{cameron2015practitioner, author={Cameron, A. Colin and Miller, Douglas L.}, title={{A practitioner’s guide to cluster-robust inference}}, journal={Journal of Human Resources}, year={2015}, volume={50}, number={2}, pages={317--372}, doi={10.3368/jhr.50.2.317}}
@article{campbell1957factors, author={Campbell, Donald T.}, title={{Factors relevant to the validity of experiments in social settings}}, journal={Psychological Bulletin}, year={1957}, volume={54}, number={4}, pages={297--312}, doi={10.1037/h0040950}}
@article{goodmanbacon2021difference, author={Goodman-Bacon, Andrew}, title={{Difference-in-differences with variation in treatment timing}}, journal={Journal of Econometrics}, year={2021}, volume={225}, number={2}, pages={254--277}, doi={10.1016/j.jeconom.2021.03.014}}
@article{harris2006use, author={Harris, Anthony D. and McGregor, Jessina C. and Perencevich, Eli N. and Furuno, Jon P. and Zhu, Jingkun and Peterson, Dan E. and Finkelstein, Joseph}, title={{The use and interpretation of quasi-experimental studies in medical informatics}}, journal={Journal of the American Medical Informatics Association}, year={2006}, volume={13}, number={1}, pages={16--23}, doi={10.1197/jamia.m1749}}
@article{imbens2008regression, author={Imbens, Guido W. and Lemieux, Thomas}, title={{Regression discontinuity designs: A guide to practice}}, journal={Journal of Econometrics}, year={2008}, volume={142}, number={2}, pages={615--635}, doi={10.1016/j.jeconom.2007.05.001}}
@article{kahnlang2020promise, author={Kahn-Lang, Ariella and Lang, Kevin}, title={{The promise and pitfalls of differences-in-differences: Reflections on 16 and Pregnant and other applications}}, journal={Journal of Business \& Economic Statistics}, year={2020}, volume={38}, number={3}, pages={613--620}, doi={10.1080/07350015.2018.1546591}}
@article{kontopantelis2015regression, author={Kontopantelis, E. and Doran, T. and Springate, D. A. and Buchan, I. and Reeves, D.}, title={{Regression based quasi-experimental approach when randomisation is not an option: Interrupted time series analysis}}, journal={BMJ}, year={2015}, volume={350}, eid={h2750}, doi={10.1136/bmj.h2750}}
@article{roth2023whats, author={Roth, Jonathan and Sant’Anna, Pedro H. C. and Bilinski, Alyssa and Poe, John}, title={{What’s trending in difference-in-differences? A synthesis of the recent econometrics literature}}, journal={Journal of Econometrics}, year={2023}, volume={235}, number={2}, pages={2218--2244}, doi={10.1016/j.jeconom.2023.03.008}}
@book{shadish2002experimental, author={Shadish, William R. and Cook, Thomas D. and Campbell, Donald T.}, title={{Experimental and quasi-experimental designs for generalized causal inference}}, year={2002}, publisher={Houghton Mifflin}}
@article{wing2018designing, author={Wing, Coady and Simon, Kosali and Bello-Gomez, Ricardo A.}, title={{Designing difference in difference studies: Best practices for public health policy research}}, journal={Annual Review of Public Health}, year={2018}, volume={39}, number={1}, pages={453--469}, doi={10.1146/annurev-publhealth-040617-013507}}
R