texreg table for impacts of spatial lag model

791 views Asked by At

I am using spdep to run a spatial regression using a Durbin lag model. This type of model returns direct, indirect and total effects for each regression coefficient and their level of significance.

Is there an R library like texreg that organizes in a nice way the output of a Durbin lag model with information about direct, indirect and total effects?

Reproducible example:

library(spdep)

example(columbus)
listw <- nb2listw(col.gal.nb)

# spatial regression - Durbin Model
  mobj <- lagsarlm(CRIME ~ INC + HOVAL, columbus, listw, type="mixed")
  summary(mobj)

# Calculate direct and indirect impacts
  W <- as(listw, "CsparseMatrix")
  trMatc <- trW(W, type="mult")
  trMC <- trW(W, type="MC")
  imp <- impacts(mobj, tr=trMC, R=100) 
  sums <- summary(imp, zstats=T)

# Return Effects
  data.frame(sums$res)

# Return p-values
  data.frame(sums$pzmat)
1

There are 1 answers

0
eipi10 On

I'm not sure if there's an existing function to create a nice looking table for this type of model object, but (with some effort) you can roll your own.

Below is an rmarkdown document with your code plus three additional code chunks. The first combines the coefficient and p-value data. The next two generate two different options for latex tables.

I used sums$res and sums$pzmat for the table values, tidyverse functions to combine the coefficient estimates and p-values and edit the column names, and the kable and kableExtra packages to produce the latex output.

rmarkdown document

---
title: "Coefficient Table for Durbin Lag Model"
author: "eipi10"
date: "8/30/2017"
output: pdf_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, message=FALSE, warning=FALSE)

library(spdep)
library(texreg)

example(columbus)
listw <- nb2listw(col.gal.nb)
```

```{r}
# spatial regression - Durbin Model
  mobj <- lagsarlm(CRIME ~ INC + HOVAL, columbus, listw, type="mixed")
  #summary(mobj)

# Calculate direct and indirect impacts
  W <- as(listw, "CsparseMatrix")
  trMatc <- trW(W, type="mult")
  trMC <- trW(W, type="MC")
  imp <- impacts(mobj, tr=trMC, R=100) 
  sums <- summary(imp, zstats=T)

# Return Effects
#  data.frame(sums$res)

# Return p-values
#  data.frame(sums$pzmat)
```

```{r extractTableData}
library(knitr)
library(kableExtra)
library(dplyr)
library(tidyr)
library(stringr)

# Extract coefficients and p-values
tab = bind_rows(sums$res) %>% t %>% as.data.frame %>% 
  setNames(., names(sums$res[[1]])) %>%
  mutate(Coef_Type=str_to_title(rownames(.)),
         Value_Type="Estimate") %>% 
  bind_rows(sums$pzmat %>% t %>% as.data.frame %>% 
              mutate(Coef_Type=rownames(.),
                     Value_Type="p-value")) %>% 
  gather(key, value, INC, HOVAL) 
```

```{r table1}
# Reshape table into desired output format
tab1 = tab %>% 
  unite(coef, key, Value_Type) %>% 
  spread(coef, value) %>% 
  mutate_if(is.numeric, round, 3)

# Change column names to what we want to see in the output table
names(tab1) = c("", gsub(".*_(.*)", "\\1", names(tab1)[-1]))

# Output latex table, including extra header row to mark coefficient names
kable(tab1, booktabs=TRUE, format="latex") %>% 
  add_header_above(setNames(c("", 2, 2), c("", sort(rownames(sums$pzmat))))) %>% 
  kable_styling(position="center")
```

\vspace{1cm}

```{r table2}
# Reshape table into desired output format
tab2 = tab %>% 
  unite(coef, Coef_Type, Value_Type) %>% 
  spread(coef, value) %>% 
  mutate_if(is.numeric, round, 3)

# Change column names to what we want to see in the output table
names(tab2) = c("Coefficient", gsub(".*_(.*)", "\\1", names(tab2)[-1]))

# Output latex table, including extra header row to mark coefficient names
kable(tab2, booktabs=TRUE, format="latex") %>% 
  add_header_above(setNames(c(" ", rep(2, 3)), c("", colnames(sums$pzmat)))) %>% 
  kable_styling(position="center")
```

PDF output document

enter image description here