tests/testthat/test-ukfpoptest.R

if(identical(Sys.getenv("NOT_CRAN"), "true")){
  
  library(ctsem)
  library(testthat)
  
  context("ukfpopcheck") 
  
  test_that("ukfpopcheck1", {
    set.seed(1)
    Tpoints<-10
    n.latent=2
    n.manifest=3
    nsubjects=60
    burnin=30
    dtmat = matrix(exp(rnorm(burnin+Tpoints-1,-.3,.5)),1)
    par1<-rnorm(nsubjects,-.3,.8)
    par2 <- par1*.4 + rnorm(nsubjects,0,.3)
    for(i in 1:nsubjects){
      gm<-ctModel(type='omx',n.latent=2,n.manifest=n.manifest,Tpoints=Tpoints,LAMBDA=matrix(c(1,.4,0,0,0,1),3,ncol=2),
        DRIFT=diag(-.4,2),
        CINT=matrix(c(par1[i],par2[i]),2),
        T0VAR=diag(.1,2),
        T0MEANS=matrix(c(3,5),n.latent),
        # MANIFESTMEANS=diag(par1[i],1), #matrix(mmeans,nrow=n.manifest),
        MANIFESTVAR=t(chol(diag(.0001,n.manifest))),
        DIFFUSION=t(chol(diag(3,2))))
      if(i==1) cd<-ctGenerate(gm,n.subjects=1,burnin=burnin,wide=FALSE,dtmat = dtmat) else {
        newdat <- ctGenerate(gm,n.subjects=1,burnin=burnin,wide=FALSE,dtmat = dtmat)
        newdat[,'id'] <- i
        cd<-rbind(cd,newdat)
      }
    }
    
    cd[,gm$manifestNames]<-(cd[,gm$manifestNames]) + rnorm(length(cd[,gm$manifestNames]),0, .9^2)
    
    
    m1<-ctModel(type='omx',n.latent=4,n.manifest=3,Tpoints=Tpoints,
      LAMBDA=cbind(gm$LAMBDA,0,0),
      MANIFESTMEANS=matrix(0,nrow=n.manifest),
      # CINT=matrix(c('cint1',0),2,1),
      # T0MEANS=matrix(c('t0m1',0),2),
      # T0VAR=matrix(c('t0var11',0, 0,'t0var22'),2,2),
      # DIFFUSION=matrix(c('diff11',0,0,1e-5),2,2),
      # DRIFT=matrix(c('dr11',0,1,-1e-5),2,2)
    )
    m1$DRIFT[3:4,] <- 0
    m1$DRIFT[,3:4] <- 0
    diag(m1$DRIFT)[3:4] <- -1e-5
    m1$DRIFT[1,3] = 1
    m1$DRIFT[2,4] = 1
    m1$DIFFUSION[3:4,] <- 0
    m1$DIFFUSION[,3:4] <- 0
    # m1$T0VAR[3:4,1:2] <- 0
    
    #model for ukf ctsem
    m2<-ctModel(type='omx',n.latent=2,n.manifest=n.manifest,Tpoints=Tpoints,
      # T0MEANS=matrix(c(0),1),
      # T0VAR=matrix(c(1.5),1),
      MANIFESTMEANS=matrix(0,n.manifest),
      CINT=matrix(paste0('cint',1:gm$n.latent)),
      # DIFFUSION=matrix(c(1.4),1),
      # DRIFT=matrix(c(-.4),1),
      TRAITVAR='auto',
      LAMBDA=gm$LAMBDA
    )
    
    
    
    # #original ctsem
    cfit1 <- ctRefineTo(dat = cd,dataform = 'long',ctmodelobj = m1,retryattempts = 1)
    ct1d=cfit1$mxobj$DRIFT$values[1:2,1:2]
    # cfit1$mxobj$DIFFUSION$result
    # cfit1$mxobj$T0VAR$result
    ctll1=cfit1$mxobj$output$fit *-.5
    
    cfit2 <- ctRefineTo(dat = cd,dataform = 'long',ctmodelobj = m2,retryattempts = 0,carefulFit=T,stationary='')
    ct2d=cfit2$mxobj$DRIFT$values
    # cfit2$mxobj$DIFFUSION$result
    # cfit2$mxobj$T0VAR$result
    ctll2=cfit2$mxobj$output$fit *-.5
    
    # summary(cfit1)$ctparameters
    # summary(cfit2)$ctparameters
    
    #bayesian / ukf ctsem
    
    
    dvec=c('ct1d','ct2d')
    llvec=c('ctll1','ctll2')
    
    sapply(dvec,get,envir=sys.frame(sys.parent(0)))
    sapply(llvec,get,envir=sys.frame(sys.parent(0)))
    
    for(di in 2:length(dvec)){
      expect_equivalent(get(dvec[di]),get(dvec[di-1]),tol=1e-1)
      expect_equivalent(get(llvec[di]),get(llvec[di-1]),tol=1e-3)
    }
    
  })
  
  
}

Try the ctsemOMX package in your browser

Any scripts or data that you put into this service are public.

ctsemOMX documentation built on Oct. 5, 2023, 5:06 p.m.