knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
devtools::load_all()
library(cshapes)
library(dplyr)
library(Matrix)
library(spdep)
library(spatialreg)
library(stargazer)
library(lubridate)
library(tidyverse)

The tscsdep package

CRAN status Project Status: Active – The project has reached a stable, usable state and is being actively
developed.

Description

A package to help estimate some of the (linear) spatial and spatio-temporal autogressive models discussed in Cook, Hays and Franzese (2020, 2021). The package provides tools to create geographic (k-nearest neighbor) spatial weights matrices for estimating Spatial AutoRegressive (SAR) models, Spatial Error Models (SEM), and Spatial Autocorrelation (SAC) models. The package is designed to work with unbalanced Country-Year Time-Series-Cross-Section (TSCS) datasets.

Installation

The package can be installed using devtools

# The development version from GitHub:

library(devtools); devtools::install_github("judechays/STADL", dependencies = TRUE)

Functions

TSCS spatial weights matrices can be created for any cross-section of countries in the international system up until the year 2019, using the cshapes package. The cross-sections can change across years to account for country entry into and exit from the international system.

+-------------------------------+--------------------------+---------------------------------+---------------------------------------+ | Object | Method | Variables | Function | +:=============================:+:========================:+:===============================:+:=====================================:+ | Weights Matrix | k-nearest neighbor | ols country_name year k | make_ntspmat(lmobj, ci, yi, k=4) | +-------------------------------+--------------------------+---------------------------------+---------------------------------------+ | Spatial AutoRegressive (SAR) | spatialreg::lagsarlm | ols W | ntspreg(ols, W) | +-------------------------------+--------------------------+---------------------------------+---------------------------------------+ | Spatial error model (SEM) | spatialreg::errorsarlm | ols W | ntsperr(ols, W) | +-------------------------------+--------------------------+---------------------------------+---------------------------------------+ | Spatial Autocorrelation (SAC) | spatialreg::sacsarlm | ols W | ntspsac(ols, W) | +-------------------------------+--------------------------+---------------------------------+---------------------------------------+

TSCS Spatial Weights Matrix

The syntax for creating a k-nearest neighbor spatial weights matrix is

W <- make_ntspmat(lmobj = ols, ci = country_name, yi = year, k=4)

where ols refers to the object returned from a linear regression, using the lm function (lm(formula = y ~ x, data = data)). country_name is the variable that identifies the sample countries, and year is the variable that identifies the sample years. The parameter k is the number of nearest neighbors you want to include the spatial weights matrix, W.

The package also provides convenient wrapper functions to estimate the SAR, SEM and SAC models using the spatial weights matrix, W. The wrappers call the largsarlm, errorsarlm, and sacsarlm functions from the spatialreg package. The main advantage of the wrapper functions is that they process the weights matrix created by make_ntspmat for use with the spatialreg functions.

Spatial AutoRegressive (SAR)

The syntax for estimating the SAR model is

ntspreg(ols, W) 

where ols again refers to the object returned from a linear regression using the lm function (lm(formula = y ~ x, data = data)), and W is the spatial weights matrix created using the make_ntspmat function.

Spatial Error Model (SEM)

ntsperr(ols, W) 

Spatial Autocorrelation (SAC)

ntspsac(ols, W) 

Inputs, Functions and Outputs

library(dagitty)
library(ggdag)
library(ggplot2)




simple_dag <- dagify(
  FW ~ lmobj + ci + yi + k,
  FSAC ~ W + lmobj,
  FSAR ~ W + lmobj,
  FSEM ~ W + lmobj,
  SAC ~ FSAC,
  SAR ~ FSAR,
  SEM ~ FSEM,
  W ~ FW,
  exposure = c("W","SAR","SEM", "SAC"),
  outcome = c("FSAC", "FSAR","FSEM","FW"),
  labels = c(FSAC = "ntspsac()", FSAR = "ntspreg()", FSEM = "ntsperr()", FW = "make_ntspmat()"),
    coords = list(x = c(x = 1, a = 2, b = 2, y = 3),
                y = c(x = 2, a = 1, b = 3, y = 2))
)




ggdag_status(simple_dag, 
             use_labels = "label", size=2, color="black") +
  guides(fill = FALSE, color = FALSE) +  
  theme_dag()

Tools for merging your data with cshapes

One of the challenges when using make_ntspmat() to create a spatial weights matrix is matching the country names from your data to the ones used in cshapes. The package includes some helper functions that make this recoding process easier. These functions are discussed and illustrated below.

+-------------------------------------+-------------------------------------------------------------------------------------------------------------------+----------------+--------------------------+ | Object | Description | Input | Function | +=====================================+===================================================================================================================+================+==========================+ | Country name list | List of all country names in cshapes | | names_list() | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------+----------------+--------------------------+ | Country information: cowcode | Provides country information in cshapes, if you know cowcode. It gives: country name, start date, and end date. | cowcode | name_code(cowcode) | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------+----------------+--------------------------+ | Country information: country_name | Provides country information in cshapes, if you know country_name. It gives: cowcode, start date, and end date. | country_name | name_text("Country name") | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------+----------------+--------------------------+

If you run make_ntspmat and receive a message saying that Some of your Country-Years are not Matched you can use the helper functions above to fix the problem.

List of all country names in cshapes
names_list()

This returns a list with all country names which looks like this:

#>   [1] "United States of America"             
#>   [2] "Canada"                               
#>   [3] "Bahamas"                              
#>   [4] "Cuba"                                 
#>   [5] "Haiti"                                
#>   [6] "Dominican Republic"                   
#>   [7] "Jamaica"                 
Checking country names and starting/ending dates in cshapes if you have a country's COW code.

For example, if you have the United States in your data, and you know cowcode==2, then you can check exact country name used in cshapes.

name_code(2)

From this output, we can see that the country name used by cshapes is "United States of America." We also see that there are three separate entries and thus three start and end dates. The start date for cshapes is 1886-01-01. The two additional entries for the United States correspond to the extensions of statehood to Alaska and Hawaii respectively.

Checking country COW codes and starting/ending dates in cshapes if you have a country's name.

If you have a country's name, but you are uncertain whether the period you are analyzing is covered by cshapes, you can check using the name_text function.

name_text("Uruguay")

Example: Income and Democracy (Acemoglu et al., 2008)

The data used in this example come from Acemoglu, D., Johnson, S., Robinson, J. A. & Yared, P. (2008), "Income and democracy," American Economic Review 98(3), 808–42. The dataset includes a global sample of countries' GDPs and their democracy scores (Polity IV scores) for the period 1960–2000 (5-year averages). A more extensive re-analysis is presented in Cook, Hays, and Franzese (2021).

The dependent variable, democracy (polity4), is the Polity IV Democracy Index. The main independent variable is GDP per capita (in PPP) lrgdpchL.

We start by matching country names and creating the spatial weights matrix. Then we estimate spatio-temporal versions of the SAR, SEM, and SAC models. These models account for global waves of democratization with period fixed effects and over-time persistence in democracy scores by including the temporally lagged dependent variable, polity4L, as a regressor.

Load data

data<-read.csv("./inst/extdata/aer_5year_APSR_full.csv")

OLS estimation

reg<-lm(formula = polity4 ~ polity4L + lrgdpchL + as.factor(year), data = data)

Create the Weight Matrix: make_ntspmat

W <- make_ntspmat(reg,country,year,10)

In this dataset, there are 29 countries with names that do not match the country names used in cshapes. We can solve this problem by re-naming these countries. For example "Cote d'Ivoire" should be "Cote D'Ivoire". The country names used in cshapes are provided by the helper function names_list(). We can also check the start (entry) and end (exit) dates using name_text("Country Name") and name_code(cowcode) helper functions.

=======================================
    Data Country Name   Data Start Year
---------------------------------------
1        Belarus             2000      
2      Burkina Faso          1965      
3        Cambodia            2000      
4    Congo, Dem. Rep.        1970      
5      Congo, Rep.           1965      
6     Cote d'Ivoire          1965      
7    Egypt, Arab Rep.        1960      
8   Ethiopia -pre 1993       1960      
9     Ethiopia 1993-         2000      
10     Gambia, The           1970      
11       Germany             1995      
12         Iran              1960      
13        Italy              1960      
14     Korea, Rep.           1960      
15    Macedonia, FYR         2000      
16      Madagascar           1965      
17  Pakistan-post-1972       1980      
18  Pakistan-pre-1972        1960      
19       Romania             1965      
20        Russia             2000      
21      Sri Lanka            1960      
22 Syrian Arab Republic      1970      
23       Tanzania            1970      
24        Turkey             1970      
25    United States          1960      
26    Venezuela, RB          1960      
27       Vietnam             1995      
28        Yemen              2000      
29       Zimbabwe            1975      
---------------------------------------

Fixing country names

The following code, using the recode_factor function from the dplyr package, re-names the unmatched countries.

library (dplyr)

data$country<-recode_factor(data$country,"Belarus"="Belarus (Byelorussia)")
data$country<-recode_factor(data$country,"Burkina Faso"="Burkina Faso (Upper Volta)")
data$country<-recode_factor(data$country,"Cambodia"="Cambodia (Kampuchea)")
data$country<-recode_factor(data$country,"Congo, Dem. Rep."="Congo, Democratic Republic of (Zaire)")
data$country<-recode_factor(data$country,"Congo, Rep."="Congo")
data$country<-recode_factor(data$country,"Cote d'Ivoire"="Cote D'Ivoire")
data$country<-recode_factor(data$country,"Egypt, Arab Rep."="Egypt")
data$country<-recode_factor(data$country,"Ethiopia -pre 1993"="Ethiopia")
data$country<-recode_factor(data$country,"Ethiopia 1993-"="Ethiopia")
data$country<-recode_factor(data$country,"Gambia, The"="Gambia")
data$country<-recode_factor(data$country,"Germany"="German Federal Republic")
data$country<-recode_factor(data$country,"Iran"="Iran (Persia)")
data$country<-recode_factor(data$country,"Italy"="Italy/Sardinia")
data$country<-recode_factor(data$country,"Korea, Rep."="Korea, Republic of")
data$country<-recode_factor(data$country,"Macedonia, FYR"="Macedonia (FYROM/North Macedonia)")
data$country<-recode_factor(data$country,"Madagascar"="Madagascar (Malagasy)")
data$country<-recode_factor(data$country,"Pakistan-post-1972"="Pakistan")
data$country<-recode_factor(data$country,"Pakistan-pre-1972"="Pakistan")
data$country<-recode_factor(data$country,"Romania"="Rumania")
data$country<-recode_factor(data$country,"Russia"="Russia (Soviet Union)")
data$country<-recode_factor(data$country,"Sri Lanka"="Sri Lanka (Ceylon)")
data$country<-recode_factor(data$country,"Syrian Arab Republic"="Syria")
data$country<-recode_factor(data$country,"Tanzania"="Tanzania (Tanganyika)")
data$country<-recode_factor(data$country,"Turkey"="Turkey (Ottoman Empire)")
data$country<-recode_factor(data$country,"United States"="United States of America")
data$country<-recode_factor(data$country,"Venezuela, RB"="Venezuela")
data$country<-recode_factor(data$country,"Vietnam"="Vietnam, Democratic Republic of")
data$country<-recode_factor(data$country,"Yemen"="Yemen (Arab Republic of Yemen)")
data$country<-recode_factor(data$country,"Zimbabwe"="Zimbabwe (Rhodesia)")
reg<-lm(formula = polity4 ~ polity4L + lrgdpchL + as.factor(year), data = data)
summary(reg)

Once we have corrected the country names, we can re-estimate the non-spatial linear regression model and create the spatial weights matrix using make_ntspmat.

reg<-lm(formula = polity4 ~ polity4L + lrgdpchL + as.factor(year), data = data)
summary(reg)
#> 
#> Call:
#> lm(formula = polity4 ~ polity4L + lrgdpchL + as.factor(year), 
#>     data = data)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -0.73614 -0.08293 -0.01148  0.06733  0.69875 
#> 
#> Coefficients:
#>                      Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)         -0.257342   0.062472  -4.119 4.17e-05 ***
#> polity4L             0.748899   0.021605  34.663  < 2e-16 ***
#> lrgdpchL             0.053035   0.008012   6.619 6.42e-11 ***
#> as.factor(year)1965 -0.055404   0.033306  -1.663   0.0966 .  
#> as.factor(year)1970 -0.071326   0.032185  -2.216   0.0269 *  
#> as.factor(year)1975 -0.074252   0.031657  -2.345   0.0192 *  
#> as.factor(year)1980 -0.043703   0.031617  -1.382   0.1673    
#> as.factor(year)1985 -0.029291   0.031616  -0.926   0.3545    
#> as.factor(year)1990  0.041154   0.031359   1.312   0.1898    
#> as.factor(year)1995  0.073656   0.031238   2.358   0.0186 *  
#> as.factor(year)2000  0.013973   0.030396   0.460   0.6458    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.1828 on 843 degrees of freedom
#> Multiple R-squared:  0.7725, Adjusted R-squared:  0.7698 
#> F-statistic: 286.2 on 10 and 843 DF,  p-value: < 2.2e-16
W <- make_ntspmat(reg,country,year,10)

The make_ntspmat function generates the weights matrix year by year. While running, each year's cross-section, with sample countries identified by COW codes, will be displayed. If the function stops before the end of the sample you will be able to recognize the problematic cross-section (year). If all of the countries in a given cross-section match with cshapes, you will see a message saying "All of your Countries are Matched."

#> [1] 1960
#>  [1] 900 305 211 140 20  225 155 710 100 94  390 42  130 651 230 530 375 220 200
#> [20] 350 90  91  750 205 630 395 666 325 663 740 732 780 70  93  210 385 920 770
#> [39] 95  135 840 235 150 92  380 800 713 165 2   101 560
#> [1] 1965
#>  [1] 160 900 305 211 434 439 145 140 482 20  225 155 710 437 471 484 100 94  390
#> [20] 130 651 230 530 375 220 481 200 452 438 350 90  91  850 750 205 630 395 666
#> [39] 325 663 740 732 780 600 580 70  432 435 820 436 475 93  210 385 790 920 770
#> [58] 95  135 840 235 150 360 433 92  380 483 461 800 713 165 2   101 560
#> [1] All of your Countries are Matched.
#> [1] 1970
#>  [1] 160 900 305 211 434 439 145 140 482 20  225 155 710 437 471 484 100 94  390
#> [20] 615 130 651 230 530 375 220 481 200 452 438 420 350 90  91  850 750 205 630
#> [39] 395 666 325 51  663 740 501 732 780 600 580 70  432 435 553 820 436 475 93 
#> [58] 210 385 790 920 95  135 840 235 150 360 517 433 830 451 92  380 652 483 461
#> [77] 800 52  616 640 713 510 500 165 2   101 560 490 551
#> [1] All of your Countries are Matched.
#> [1] 1975
#>  [1] 160 900 305 516 211 434 439 145 140 571 482 20  225 155 710 437 471 484 100
#> [20] 94  352 390 42  615 130 651 530 375 950 220 481 200 452 438 420 411 350 90 
#> [39] 110 91  41  310 850 750 205 630 395 666 325 51  663 740 501 732 780 570 600
#> [58] 580 70  432 435 590 553 820 436 475 93  210 385 790 920 95  135 840 150 360
#> [77] 517 433 830 451 92  380 652 483 461 800 52  616 640 713 510 500 165 2   101
#> [96] 560 490 551 552
#> [1] All of your Countries are Matched.
#> [1] 1980
#>   [1] 540 160 900 305 516 211 434 439 771 145 140 571 482 20  225 155 710 437
#>  [19] 471 484 100 581 94  352 390 42  615 130 651 530 375 950 220 481 200 452
#>  [37] 438 420 404 411 350 90  110 41  310 850 750 205 395 666 325 51  663 740
#>  [55] 501 732 780 570 600 580 70  432 541 435 590 553 820 436 475 210 385 790
#>  [73] 920 770 95  135 840 910 150 360 517 433 830 451 380 652 461 800 52  616
#>  [91] 640 713 510 500 165 2   101 560 490 551 552
#> [1] All of your Countries are Matched.
#> [1] 1985
#>   [1] 540 160 900 305 516 211 434 439 771 145 140 571 482 20  225 155 710 437
#>  [19] 471 484 100 581 94  352 390 42  615 130 651 230 530 375 950 220 481 200
#>  [37] 452 438 420 404 411 350 110 41  310 850 750 205 395 666 325 51  663 740
#>  [55] 501 732 780 570 600 580 70  432 541 435 590 553 820 436 475 210 385 790
#>  [73] 920 770 95  135 840 910 290 235 150 360 517 433 830 451 380 652 461 800
#>  [91] 52  616 640 713 510 165 2   101 560 490 551 552
#> [1] All of your Countries are Matched.
#> [1] 1990
#>   [1] 540 160 900 305 516 211 439 771 145 140 571 482 20  225 155 710 437 471
#>  [19] 484 100 581 94  40  352 390 42  615 130 651 230 530 375 950 220 200 452
#>  [37] 438 420 404 411 350 110 91  41  310 850 750 205 630 395 666 325 51  663
#>  [55] 740 501 732 780 570 600 580 70  432 541 435 590 553 820 436 475 93  210
#>  [73] 385 790 920 770 95  135 840 910 290 235 150 360 517 433 830 451 92  380
#>  [91] 652 483 461 800 52  616 640 713 510 165 2   101 560 490 551 552
#> [1] All of your Countries are Matched.
#> [1] 1995
#>   [1] 160 900 305 211 439 771 145 140 571 482 20  225 155 710 437 471 484 100
#>  [19] 94  40  352 255 390 42  615 130 651 230 375 950 220 200 452 438 420 404
#>  [37] 411 350 90  110 91  41  310 850 750 205 630 395 666 325 51  663 740 501
#>  [55] 732 780 570 600 580 70  432 541 435 590 553 820 565 436 475 93  210 385
#>  [73] 790 920 770 95  135 840 910 290 235 150 360 517 433 830 451 92  380 652
#>  [91] 483 461 800 52  616 640 713 510 500 165 2   101 816 560 551 552
#> [1] All of your Countries are Matched.
#> [1] 2000
#>   [1] 339 160 371 900 305 373 211 434 439 771 355 370 145 140 571 482 20  225
#>  [19] 155 710 437 471 484 100 94  40  352 316 255 390 42  615 130 651 230 366
#>  [37] 530 375 220 481 200 452 438 420 404 411 350 90  110 91  344 41  310 850
#>  [55] 750 205 630 395 666 325 51  663 740 705 501 703 811 732 780 368 367 600
#>  [73] 359 580 70  343 432 541 435 590 553 820 565 436 475 93  210 385 790 920
#>  [91] 770 95  840 910 290 235 150 360 365 517 433 830 92  317 349 380 652 483
#> [109] 461 800 52  616 640 713 510 500 369 165 2   704 101 816 679 560 551 552
#> [1] All of your Countries are Matched.

Estimate Spatial Lag Models

SAR ntspreg

In this model, ρ is the coeffcient for the spatially lagged outcome variable.

lag <- ntspreg(reg,W)
summary(lag)
#> 
#> Call:spatialreg::lagsarlm(formula = formula, data = df, listw = listw, 
#>     method = "eigen", zero.policy = TRUE, tol.solve = 1e-10)
#> 
#> Residuals:
#>        Min         1Q     Median         3Q        Max 
#> -0.7549372 -0.0809244 -0.0095003  0.0670258  0.6844804 
#> 
#> Type: lag 
#> Coefficients: (asymptotic standard errors) 
#>                       Estimate Std. Error z value  Pr(>|z|)
#> (Intercept)         -0.3079667  0.0656794 -4.6889 2.746e-06
#> polity4L             0.7457442  0.0214521 34.7633 < 2.2e-16
#> lrgdpchL             0.0531095  0.0079384  6.6902 2.229e-11
#> as.factor(year)1965 -0.0589817  0.0330236 -1.7860   0.07409
#> as.factor(year)1970 -0.0751453  0.0319103 -2.3549   0.01853
#> as.factor(year)1975 -0.0758992  0.0313635 -2.4200   0.01552
#> as.factor(year)1980 -0.0436485  0.0313208 -1.3936   0.16344
#> as.factor(year)1985 -0.0306376  0.0313216 -0.9782   0.32799
#> as.factor(year)1990  0.0407703  0.0310648  1.3124   0.18938
#> as.factor(year)1995  0.0733024  0.0309442  2.3689   0.01784
#> as.factor(year)2000  0.0157911  0.0301255  0.5242   0.60016
#> 
#> Rho: 0.092467, LR test value: 4.488, p-value: 0.034134
#> Asymptotic standard error: 0.042432
#>     z-value: 2.1792, p-value: 0.02932
#> Wald statistic: 4.7487, p-value: 0.02932
#> 
#> Log likelihood: 247.2436 for lag model
#> ML residual variance (sigma squared): 0.032792, (sigma: 0.18109)
#> Number of observations: 854 
#> Number of parameters estimated: 13 
#> AIC: -468.49, (AIC for lm: -466)
#> LM test for residual autocorrelation
#> test value: 0.33204, p-value: 0.56446
SEM ntsperr

In this model, λ is the coefficient on the spatially lagged disturbance term.

lag_err <- ntsperr(reg,W)
summary(lag_err)
#> 
#> Call:spatialreg::errorsarlm(formula = formula, data = df, listw = listw, 
#>     method = "eigen", zero.policy = TRUE, tol.solve = 1e-11)
#> 
#> Residuals:
#>       Min        1Q    Median        3Q       Max 
#> -0.736974 -0.083456 -0.011526  0.068874  0.698778 
#> 
#> Type: error 
#> Coefficients: (asymptotic standard errors) 
#>                       Estimate Std. Error z value  Pr(>|z|)
#> (Intercept)         -0.2589496  0.0621459 -4.1668 3.089e-05
#> polity4L             0.7475215  0.0214992 34.7698 < 2.2e-16
#> lrgdpchL             0.0534045  0.0079733  6.6979 2.114e-11
#> as.factor(year)1965 -0.0560378  0.0330115 -1.6975   0.08960
#> as.factor(year)1970 -0.0723244  0.0318947 -2.2676   0.02335
#> as.factor(year)1975 -0.0746763  0.0313722 -2.3803   0.01730
#> as.factor(year)1980 -0.0432951  0.0313410 -1.3814   0.16715
#> as.factor(year)1985 -0.0299043  0.0313366 -0.9543   0.33993
#> as.factor(year)1990  0.0405267  0.0310994  1.3031   0.19253
#> as.factor(year)1995  0.0728451  0.0309618  2.3527   0.01864
#> as.factor(year)2000  0.0138366  0.0301252  0.4593   0.64602
#> 
#> Lambda: 0.062942, LR test value: 0.65125, p-value: 0.41966
#> Asymptotic standard error: 0.078322
#>     z-value: 0.80363, p-value: 0.42161
#> Wald statistic: 0.64583, p-value: 0.42161
#> 
#> Log likelihood: 245.3253 for error model
#> ML residual variance (sigma squared): 0.032952, (sigma: 0.18153)
#> Number of observations: 854 
#> Number of parameters estimated: 13 
#> AIC: -464.65, (AIC for lm: -466)
SAC ntspsac

In this model, ρ is the coefficient on the spatially lagged outcome variable, and λ is the coefficient on the spatially lagged disturbance term.

lag_sac <- ntspsac(reg,W)
summary(lag_sac)
lag_sac <- ntspsac(reg,W)
summary(lag_sac)
#> 
#> Call:spatialreg::sacsarlm(formula = formula, data = df, listw = listw, 
#>     method = "eigen", zero.policy = TRUE, tol.solve = 1e-10)
#> 
#> Residuals:
#>       Min        1Q    Median        3Q       Max 
#> -0.757587 -0.080138 -0.010874  0.066737  0.680636 
#> 
#> Type: sac 
#> Coefficients: (asymptotic standard errors) 
#>                      Estimate Std. Error z value  Pr(>|z|)
#> (Intercept)         -0.313396   0.066420 -4.7184 2.377e-06
#> polity4L             0.745464   0.021458 34.7400 < 2.2e-16
#> lrgdpchL             0.052735   0.007919  6.6592 2.753e-11
#> as.factor(year)1965 -0.059242   0.033072 -1.7913   0.07324
#> as.factor(year)1970 -0.075151   0.031963 -2.3512   0.01871
#> as.factor(year)1975 -0.075805   0.031400 -2.4142   0.01577
#> as.factor(year)1980 -0.044000   0.031348 -1.4036   0.16043
#> as.factor(year)1985 -0.030298   0.031352 -0.9664   0.33385
#> as.factor(year)1990  0.041215   0.031080  1.3261   0.18480
#> as.factor(year)1995  0.073868   0.030974  2.3849   0.01709
#> as.factor(year)2000  0.016229   0.030163  0.5381   0.59054
#> 
#> Rho: 0.10702
#> Asymptotic standard error: 0.048627
#>     z-value: 2.2008, p-value: 0.027748
#> Lambda: -0.054986
#> Asymptotic standard error: 0.10084
#>     z-value: -0.54527, p-value: 0.58557
#> 
#> LR test value: 4.8089, p-value: 0.090316
#> 
#> Log likelihood: 247.4041 for sac model
#> ML residual variance (sigma squared): 0.032765, (sigma: 0.18101)
#> Number of observations: 854 
#> Number of parameters estimated: 14 
#> AIC: -466.81, (AIC for lm: -466)
Model Selection

In this example, all of the specification tools select the SAR model. The Wald and Likelihood ratio tests reject the null hypothesis ρ = 0, but fail to reject λ = 0. The Akaike Information Criterion (AIC) also selects the SAR as the best fitting model. The Bayesian Information Criterion selects the SAR model as well.

BIC(lag)
BIC(lag_err)
BIC(lag_sac)
BIC(lag)
#> [1] -406.7382
BIC(lag_err)
#> [1] -402.9015
BIC(lag_sac)
#> [1] -400.3092

Given the temporally lagged dependent variable in the SAR specification, this model is the first-order spatio-temporal autoregressive distributed lag (STADL) model discussed in Cook, Hays and Franzese (2021).

Citation

To cite tscsdep in publications, please use:

citation("tscsdep") 

Authors

Jude Hays (jch61\@pitt.edu{.email}), Valentina González-Rostani (mag384\@pitt.edu{.email}), Scott Cook (sjcook\@tamu.edu{.email}), Robert Franzese (franzese\@umich.edu{.email}), and Wooseok Kim (wskr\@umich.edu{.email})

Mantainer

Jude Hays (jch61\@pitt.edu{.email})

References



judechays/STADL documentation built on May 12, 2022, 10:50 p.m.