---
title: "Supported Models"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Supported Models}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

This vignette shows **model engines** that `DAGassist` has been verified to work with and provides concrete usage examples.
The list is illustrative, not exhaustive. `DAGassist` is model-agnostic: if an engine accepts a standard `formula + data` interface, it will usually work. 

If you want support documented (or added) for an engine not shown here, please [open an issue or PR on GitHub.](https://grahamgoff.github.io/DAGassist/)

| Package | Function |
|---------|----------|
| estimatr| lm_robust|
| fixest  | feglm    |
| fixest  | feols    |
| lfe     | felm     |
| lme4    | glmer    |
| lmerTest| lmer     |
| MASS    | glm.nb   |
| stats   | lm       |


## Notes
- **Clusters:** You may pass cluster variables as a bare name, a string, or a one-sided formula (e.g., `clusters = cat_b`, `"cat_b"`, or `~cat_b`). `DAGassist` resolves them within `data`.
- **Fixed/Random effects:** Random-effects bars (e.g., `(1 | group)`) and fixest FE/IV tails `(| fe ...)` in your formula are preserved.
- **Difference-in-Differences:** DiD notation works, but the interaction term must be included as a node in the DAG, named exactly as in the model, and set as the exposure. `DAGassist` breaks if the exposure is missing or mismatched.

## Example usage

### estimatr::lm_robust
```{r lm-robust, eval=FALSE}
DAGassist(
    dag = dag_model,
    formula = estimatr::lm_robust(
        ancvs_change_1116 ~ western_belt +
            unemploy_broad + black_popshare + col_popshare +
            indasian_popshare + other_popshare + share_formal +
            share_informal + share_traditional + afrikaans_popshare +
            english_popshare + isindebele_popshare + isixhosa_popshare +
            sepedi_popshare + sesotho_popshare + setswana_popshare +
            signlanguage_popshare + siswati_popshare + tshivenda_popshare +
            xitsonga_popshare +
            latitude + longitude + latitudelongitude,
        data     = df,
        clusters = cat_b)
)
```

### fixest::feglm

```{r feglm, eval=FALSE}
DAGassist(
    dag = dag_model2,
    formula = fixest::feglm(
        exc_eq ~ cat4_prevalence_best + nonvprotgovt + v2x_gencs +
            WINGOImputed_fill + UNintervention + majpowintervention + UNwomen + 
            religious + ideolleft + lgt + substantive + v2x_gencl + 
            Krause_wpm_neg + eqgen_binary,
        data = df %>% filter(interstateonly==0, inter_intrastate==0),
        family = binomial("logit"),
        cluster = ~cowcode
    )
)
```


### fixest::feols

```{r feols, eval=FALSE}

DAGassist(
  dag = dag_model,
  formula = fixest::feols(
    psoe ~ time * treated2 + log_pop + no_education + growthunemployment+ 
      men_50_rs + immigration_rs + ebal_w | province,
    data = df,
    cluster = ~municipality)
)
```

### lfe::felm

```{r felm, eval=FALSE}
DAGassist(dag=dag_model,
          formula = lfe::felm(
              share_female ~ lag_democracy_stock_poly_95 + lag_v2xcl_rol + 
                  lag_v2xcl_prpty + lag_v2x_rule + lag_v2x_jucon +
                  lag_v2xlg_legcon + lag_v2x_corr + lag_v2clstown + 
                  lag_v2xcs_ccsi + lag_v2xps_party | year + country_isocode | 0 | 
                  country_isocode,
              data=df_cross)
)
```


### lme4::glmer

```{r glmer, eval=FALSE}

DAGassist(
    dag = dag_model,
    formula = lme4::glmer(
        dsu_file ~ specific + lnearnings + distortion + progress + duration +
            eu + japan + mexico + korea + nonoecd + 
            lntotdirx + lnprod + lnpolcon + active301 +
            (1 | isic3_4dig),
        data   = df,
        family = binomial(link = "logit"),
        control = glmerControl(optimizer = "bobyqa"))
)
```

### lmerTest::lmer

```{r lmerTest, eval=FALSE}

DAGassist(
    dag = dag_model,
    formula = lmerTest::lmer(
        ekloges_PERCENTAGE_May_2012_GD ~ ekloges_PERCENTAGE_2009_GD +
            N_AntifaEvent_notzero2_Oc09_May12 + avg_age + log_population  +
            prop_ksenoi + (1|code_perif), 
        data=dta))

```


### MASS::glm.nb

```{r glm-nb, eval=FALSE}
DAGassist(
  dag = dag_model,
  formula = MASS::glm.nb(
    protestcount ~ civilcas_percapita + sigact_percapita + log_pop + shiapop_perc
      kurdpop_perc + urban + totaloilvolx + lognearestcity + feb2011 + nov2010 +
      laggedprotestcount + illiterate + incomequintilelowest + 
      incomequintilehighest + urate + powercontinuous,
    data = iraqevents_timeseries_small,
    control = glm.control(maxit = 50),
    link = "log")
)
```

### stats::lm

```{r lm, eval=FALSE}
DAGassist(
  dag = dag_model,
  formula = stats::lm(
    restraint ~ nonvio2 + prime_frat + prime_future + prime_RU + prime_UN + 
      oppose92coup2 + civwar + islamist + supp_sharia + active + conscript + 
      soldier + junoff + senoff + branch2 + train_west + train_russia + 
      train_china + young + sex + edu + urban_area + employed + student + 
      arabic + econ1 + corr1 + dem + supp_opp_parties + continue + protested + 
      preboutef + post_exp + mon + factor(fgov), 
    data=data)
)
```

