Kausaalinen päättely
Menetelmät > Vakiointi ja g-kaava

Vakiointi voidaan tehdä käytännössä neljässä vaiheessa: mallintamalla vastemuuttuja, tekemällä kontrafaktuaalinen aineisto, ennustamalla uudet arvot ja keskiarvoistamalla. Kun mukana on sekoittavia tekijöitä (L) ja valintaharhaa (C), mallinnetaan siis keskiarvo  E[Y|A=a,C=0,L=l].
Yleinen g-kaava (engl. g formula) on muotoa  \sum _{\bar {l}}E[Y|{\bar {A}}={\bar {a}},{\bar {L}}={\bar {l}}]\prod _{k=0}^{K}f(l_{k}|{\bar {a}}_{k-1},{\bar {l}}_{k-1})\prod _{k=0}^{K}f^{int}(a_{k}|{\bar {a}}_{k-1},{\bar {l}}_{k}).
Laskennallisesti vakiointi voi näyttää esim. seuraavalta (R):
vastemalli <- glm(
    # Huom. "seko" viittaa sekoittajaan tai tämän edustajaan.
    # Muuttujat seko1 ja seko2 ovat ns. riittävä korjausjoukko.
    formula = vaste ~ syy + seko1 + seko2 + I(seko2),
    family = gaussian(),
    data = data
)

# Kontrafaktuaalinen aineisto syyn arvolla 0
data0 <- data %>% mutate(syy = 0, vaste = NA)
vastemalli_ennuste0 <- predict(vastemalli, data0)
keskiarvo0 <- mean(vastemalli_ennuste0)

# Kontrafaktuaalinen aineisto syyn arvolla 1
data1 <- data %>% mutate(syy = 1, vaste = NA)
vastemalli_ennuste1 <- predict(vastemalli, data1)
keskiarvo1 <- mean(vastemalli_ennuste1)

vaikutus <- keskiarvo0 - keskiarvo1
# Arvioi epävarmuus esim. bootstrap-menetelmällä.
Laskennallisesti g-kaava voi näyttää esim. yhteen funktioon spesifioituna seuraavalta:
vaikutukset <- gfoRmula::gformula(
    # Määritä data. 
    obs_data = data, 
    id = "id",
    time_name = "aika0", # Yksi aikamuuttuja. 
    outcome_name = "vaste", # Yksi vaste. 
    outcome_type = "survival", # Vasteen asteikko.
    # Kaksi aikasekoittajaa ja syy.
    covnames = c('aikaseko1', 'aikaseko2', 'syy'), 
    # Edellisten asteikot.
    covtypes = c('binary', 'bounded normal', 'binary'), 
    basecovs = c('perusseko3'), # Yksi perussekoittaja. 
    compevent_name = "kilpavaste", # Yksi kilpaileva vaste.
    #
    # Määritä yleistetyt lineaariset mallit kaikille muuttujille.
    histvars = list(
        c('syy', 'aikaseko1', 'aikaseko2'), 
        c('aikaseko1', 'aikaseko2')
    ),
    histories = c(lagged, lagavg),
    covparams = list(
        covlink = c('logit', 'identity', 'logit'), 
        covmodels = c(
            aikaseko1 ~ lag1_syy + 
                        lag_cumavg1_aikaseko1 + 
                        lag_cumavg1_aikaseko2 + 
                        perusseko3 + 
                        aika0, 
            aikaseko2 ~ lag1_syy + 
                        aikaseko1 + 
                        lag_cumavg1_aikaseko1 + 
                        lag_cumavg1_aikaseko2 + 
                        perusseko3 + 
                        aika0, 
            syy ~ lag1_syy + 
                  aikaseko1 + 
                  aikaseko2 + 
                  lag_cumavg1_aikaseko1 + 
                  lag_cumavg1_aikaseko2 + 
                  perusseko3 + 
                  aika0
        )
    ), 
    ymodel = vaste ~ syy + 
                     lag1_syy +
                     aikaseko1 + 
                     aikaseko2 + 
                     lag1_aikaseko1 + 
                     lag1_aikaseko2 + 
                     perusseko3 + 
                     aika0,
    compevent_model = kilpavaste ~ syy + 
                                   lag1_syy +
                                   aikaseko1 + 
                                   aikaseko2 + 
                                   lag1_aikaseko1 + 
                                   lag1_aikaseko2 + 
                                   perusseko3 + 
                                   aika0,
    #
    # Määritä haluttu syykontrasti.
    intvars = list("syy", "syy"), 
    int_descript = c('Aina ei', 'Aina kyllä'),
    interventions = list(
        list(c(static, rep(0, times = 7))),
        list(c(static, rep(1, times = 7)))
    )
)