Skip to contents

R2spa is a free and open-source R package that performs two-stage path analysis (2S-PA). With 2S-PA, researchers can perform path analysis by first obtaining factor scores and then adjusting for measurement errors using estimates of observation-specific reliability or standard error of those factor scores. As a viable alternative to SEM, 2S-PA has been shown to give equally-good estimates as SEM in relatively simple models and large sample sizes, as well as to give more accurate parameter estimates, has better control of Type I error rates, and has substantially less convergence problems in more complex models or small sample sizes.

Installation

This package is still in developmental stage and can be installed on GitHub with:

# install.packages("remotes")
remotes::install_github("Gengrui-Zhang/R2spa")

Example

library(lavaan)
library(R2spa)

# Joint model
model <- '
  # latent variable definitions
    ind60 =~ x1 + x2 + x3
    dem60 =~ y1 + y2 + y3 + y4

  # regression
    dem60 ~ ind60
'
# 2S-PA
# Stage 1: Get factor scores and standard errors for each latent construct
fs_dat_ind60 <- get_fs(data = PoliticalDemocracy,
                       model = "ind60 =~ x1 + x2 + x3")
fs_dat_dem60 <- get_fs(data = PoliticalDemocracy,
                       model = "dem60 =~ y1 + y2 + y3 + y4")
fs_dat <- cbind(fs_dat_ind60, fs_dat_dem60)

# get_fs() gives a dataframe with factor scores and standard errors
head(fs_dat)
#>     fs_ind60 fs_ind60_se ind60_by_fs_ind60 ev_fs_ind60   fs_dem60 fs_dem60_se
#> 1 -0.5261683   0.1213615         0.9657673  0.01472862 -2.7487224   0.6756472
#> 2  0.1436527   0.1213615         0.9657673  0.01472862 -3.0360803   0.6756472
#> 3  0.7143559   0.1213615         0.9657673  0.01472862  2.6718589   0.6756472
#> 4  1.2399257   0.1213615         0.9657673  0.01472862  2.9936997   0.6756472
#> 5  0.8319080   0.1213615         0.9657673  0.01472862  1.9242932   0.6756472
#> 6  0.2123845   0.1213615         0.9657673  0.01472862  0.9922798   0.6756472
#>   dem60_by_fs_dem60 ev_fs_dem60
#> 1         0.8868049   0.4564991
#> 2         0.8868049   0.4564991
#> 3         0.8868049   0.4564991
#> 4         0.8868049   0.4564991
#> 5         0.8868049   0.4564991
#> 6         0.8868049   0.4564991
# Stage 2: Perform 2S-PA
tspa_fit <- tspa(
  model = "dem60 ~ ind60",
  data = fs_dat,
  se_fs = list(ind60 = 0.1213615, dem60 = 0.6756472)
)
parameterestimates(tspa_fit)
#>        lhs op      rhs   est    se     z pvalue ci.lower ci.upper
#> 1    ind60 =~ fs_ind60 1.000 0.000    NA     NA    1.000    1.000
#> 2    dem60 =~ fs_dem60 1.000 0.000    NA     NA    1.000    1.000
#> 3 fs_ind60 ~~ fs_ind60 0.015 0.000    NA     NA    0.015    0.015
#> 4 fs_dem60 ~~ fs_dem60 0.456 0.000    NA     NA    0.456    0.456
#> 5    dem60  ~    ind60 1.329 0.332 4.000      0    0.678    1.981
#> 6    ind60 ~~    ind60 0.416 0.070 5.914      0    0.278    0.553
#> 7    dem60 ~~    dem60 2.842 0.543 5.235      0    1.778    3.906

This package is based upon work supported by the National Science Foundation under Grant No. 2141790.