---
output:
html_document: default
pdf_document: default
---
title: "Ch 5 PFA in dynr"
author: "Sy-Miin Chow"
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, message = FALSE)
```
```{r, echo = TRUE}
rm(list=ls())
# Load packages
require(dynr)
```
## A demo for how to specify dynr recipes for a process factor analysis model
```{r, echo = TRUE}
#Prepare dynr recipes
#Define the dynamic model
dynamics <- prep.matrixDynamics(
values.dyn=matrix(c(.5, 0.1, .3, .5), ncol=2,byrow=TRUE),
params.dyn=matrix(c('phi11', 'phi12', 'phi21', 'phi22'), ncol=2,byrow=TRUE),
isContinuousTime=FALSE)
# get error on below code:
# Error in if (d[1] != length(rnames)) { : argument is of length zero
meas <- prep.measurement(
values.load=matrix(c(1,0,
2,0,
1,0,
0,1,
0,2,
0,1),ncol=2,byrow=TRUE), #Starting values for entries in Lambda
params.load=matrix(c('fixed',0,
'lambda21',0,
'lambda31',0,
0,'fixed',
0,'lambda52',
0,'lambda62'),
ncol=2,byrow=TRUE), #Labels for fixed and freed parameters
values.int = matrix(rep(0.1,6),ncol=1),
params.int = matrix(paste0('int',1:6),ncol=1),
state.names=c("eta1","eta2"), #Labels for latent variables in eta(t)
obs.names=paste0('V',1:6) #Labels for observed variables in y(t)
)
#Note that in dynr, prep.initial sets the structure of E(eta(1|0)) and Cov(eta(1|0))
#Here, initial condition covariance matrix is fixed to a diagonal matrix of 2s.
#Could also be freely estimated with #multiple-subject data.
#Iinitial means are fixed to a vector of zeros.
initial <- prep.initial(
values.inistate=c(0, 0),
params.inistate=c('fixed', 'fixed'),
values.inicov=matrix(c(2,0,0,2),ncol=2),
params.inicov=matrix(c('fixed','fixed','fixed','fixed'),ncol=2))
#Process and measurement noise covariance matrices
mdcov <- prep.noise(
values.latent=matrix(c(2,.5,
.5,6),ncol=2,byrow=TRUE),
params.latent=matrix(c('psi_11','psi_12',
'psi_12','psi_22'),ncol=2,byrow=TRUE),
values.observed=diag(rep(.5,6),6),
params.observed=diag(paste0('var_e',1:6),6)
)
```
## Read in data and set up data structure in dynr
```{r, echo = TRUE}
ch5 = read.table('/Users/kgates/Box Sync/CRC BOOK/Code for online supplement/Chapter 5/dynr/Chpt_5_data_final500.csv',header=TRUE,sep=",")
#ch5 <- y # from lavaan rmd
ch5 = cbind(ch5,rep(1,dim(ch5)[1]), seq(1:dim(ch5)[1])) #Add subject ID and time to the data set
colnames(ch5) <- c(paste0("V", 1:6), "ID", "Time")
# Data
ch52 <- dynr.data(ch5, id="ID", time="Time", observed=paste0("V",1:6))
```
## Cook it!
```{r, echo = TRUE}
#Put recipes and data together to prepare the full model
model <- dynr.model(dynamics=dynamics, measurement=meas,
noise=mdcov, initial=initial, data=ch52,
outfile="PFA3.c")
#Use the `$' sign to set upper and lower boundaries for the parameters
#For parameters that are subjected to user-specified (e.g., via
#"prep.tfun) transformations or system transformations (e.g., variance-
#covariance parameters in the process and measurement error cov matrices),
#it may be easier to use the `@' sign to set upper and lower boundaries
#on the unconstrained (untransformed) scales - e.g., for the log of a variance
#parameter as opposed to the variance.
model@ub[!model$param.names %in% c('psi_11','psi_12','psi_22')] =
c(rep(2,3), rep(5,4), rep(log(10),6))
model@lb[!model$param.names %in% c('psi_11','psi_12','psi_22')] =
c(rep(-2,3), rep(-5,4), rep(log(1e-10),6))
```
```{r, echo = TRUE, results="hide"}
res <- dynr.cook(model)
```
```{r, echo = TRUE}
coef(res)
summary(res)
```