dsem {dsem} | R Documentation |
Fit dynamic structural equation model
Description
Fits a dynamic structural equation model
Usage
dsem(
sem,
tsdata,
family = rep("fixed", ncol(tsdata)),
estimate_delta0 = FALSE,
control = dsem_control(),
covs = colnames(tsdata)
)
Arguments
sem |
Specification for time-series structural equation model structure
including lagged or simultaneous effects. See Details section in
|
tsdata |
time-series data, as outputted using |
family |
Character-vector listing the distribution used for each column of |
estimate_delta0 |
Boolean indicating whether to estimate deviations from equilibrium in initial year as fixed effects, or alternatively to assume that dynamics start at some stochastic draw away from the stationary distribution |
control |
Output from |
covs |
optional: a character vector of one or more elements, with each element giving a string of variable names, separated by commas. Variances and covariances among all variables in each such string are added to the model. Warning: covs="x1, x2" and covs=c("x1", "x2") are not equivalent: covs="x1, x2" specifies the variance of x1, the variance of x2, and their covariance, while covs=c("x1", "x2") specifies the variance of x1 and the variance of x2 but not their covariance. These same covariances can be added manually via argument 'sem', but using argument 'covs' might save time for models with many variables. |
Details
A DSEM involves (at a minimum):
- Time series
a matrix
\mathbf X
where column\mathbf x_c
for variable c is a time-series;- Path diagram
a user-supplied specification for the path coefficients, which define the precision (inverse covariance)
\mathbf Q
for a matrix of state-variables and seemake_dsem_ram
for more details on the math involved.
The model also estimates the time-series mean \mathbf{\mu}_c
for each variable.
The mean and precision matrix therefore define a Gaussian Markov random field for \mathbf X
:
\mathrm{vec}(\mathbf X) \sim \mathrm{MVN}( \mathrm{vec}(\mathbf{I_T} \otimes \mathbf{\mu}), \mathbf{Q}^{-1})
Users can the specify
a distribution for measurement errors (or assume that variables are measured without error) using
argument family
. This defines the link-function g_c(.)
and distribution f_c(.)
for each time-series c
:
y_{t,c} \sim f_c( g_c^{-1}( x_{t,c} ), \theta_c )
dsem
then estimates all specified coefficients, time-series means \mu_c
, and distribution
measurement errors \theta_c
via maximizing a log-marginal likelihood, while
also estimating state-variables x_{t,c}
.
summary.dsem
then assembles estimates and standard errors in an easy-to-read format.
Standard errors for fixed effects (path coefficients, exogenoux variance parameters, and measurement error parameters)
are estimated from the matrix of second derivatives of the log-marginal likelihod,
and standard errors for random effects (i.e., missing or state-space variables) are estimated
from a generalization of this method (see sdreport
for details).
Value
An object (list) of class 'dsem'. Elements include:
- obj
TMB object from
MakeADFun
- ram
RAM parsed by
make_dsem_ram
- model
SEM structure parsed by
make_dsem_ram
as intermediate description of model linkages- tmb_inputs
The list of inputs passed to
MakeADFun
- opt
The output from
nlminb
- sdrep
The output from
sdreport
- interal
Objects useful for package function, i.e., all arguments passed during the call
References
**Introducing the package, its features, and comparison with other software (to cite when using dsem):**
Thorson, J. T., Andrews, A., Essington, T., Large, S. (In review). Dynamic structural equation models synthesize ecosystem dynamics constrained by ecological mechanisms.
Examples
# Define model
sem = "
# Link, lag, param_name
cprofits -> consumption, 0, a1
cprofits -> consumption, 1, a2
pwage -> consumption, 0, a3
gwage -> consumption, 0, a3
cprofits -> invest, 0, b1
cprofits -> invest, 1, b2
capital -> invest, 0, b3
gnp -> pwage, 0, c2
gnp -> pwage, 1, c3
time -> pwage, 0, c1
"
# Load data
data(KleinI, package="AER")
TS = ts(data.frame(KleinI, "time"=time(KleinI) - 1931))
tsdata = TS[,c("time","gnp","pwage","cprofits",'consumption',
"gwage","invest","capital")]
# Fit model
fit = dsem( sem=sem,
tsdata = tsdata,
estimate_delta0 = TRUE,
control = dsem_control(quiet=TRUE) )
summary( fit )
plot( fit )
plot( fit, edge_label="value" )