1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/twostage.R
\name{twostage.lvmfit}
\alias{twostage.lvmfit}
\alias{twostage.lvm}
\alias{twostage.lvm.mixture}
\alias{twostage.estimate}
\alias{nonlinear}
\alias{nonlinear<-}
\title{Two-stage estimator (non-linear SEM)}
\usage{
\method{twostage}{lvmfit}(
object,
model2,
data = NULL,
predict.fun = NULL,
id1 = NULL,
id2 = NULL,
all = FALSE,
formula = NULL,
std.err = TRUE,
...
)
}
\arguments{
\item{object}{Stage 1 measurement model}
\item{model2}{Stage 2 SEM}
\item{data}{data.frame}
\item{predict.fun}{Prediction of latent variable}
\item{id1}{Optional id-variable (stage 1 model)}
\item{id2}{Optional id-variable (stage 2 model)}
\item{all}{If TRUE return additional output (naive estimates)}
\item{formula}{optional formula specifying non-linear relation}
\item{std.err}{If FALSE calculations of standard errors will be skipped}
\item{...}{Additional arguments to lower level functions}
}
\description{
Two-stage estimator for non-linear structural equation models
}
\examples{
m <- lvm(c(x1,x2,x3)~f1,f1~z,
c(y1,y2,y3)~f2,f2~f1+z)
latent(m) <- ~f1+f2
d <- simulate(m,100,p=c("f2,f2"=2,"f1,f1"=0.5),seed=1)
## Full MLE
ee <- estimate(m,d)
## Manual two-stage
\dontrun{
m1 <- lvm(c(x1,x2,x3)~f1,f1~z); latent(m1) <- ~f1
e1 <- estimate(m1,d)
pp1 <- predict(e1,f1~x1+x2+x3)
d$u1 <- pp1[,]
d$u2 <- pp1[,]^2+attr(pp1,"cond.var")[1]
m2 <- lvm(c(y1,y2,y3)~eta,c(y1,eta)~u1+u2+z); latent(m2) <- ~eta
e2 <- estimate(m2,d)
}
## Two-stage
m1 <- lvm(c(x1,x2,x3)~f1,f1~z); latent(m1) <- ~f1
m2 <- lvm(c(y1,y2,y3)~eta,c(y1,eta)~u1+u2+z); latent(m2) <- ~eta
pred <- function(mu,var,data,...)
cbind("u1"=mu[,1],"u2"=mu[,1]^2+var[1])
(mm <- twostage(m1,model2=m2,data=d,predict.fun=pred))
if (interactive()) {
pf <- function(p) p["eta"]+p["eta~u1"]*u + p["eta~u2"]*u^2
plot(mm,f=pf,data=data.frame(u=seq(-2,2,length.out=100)),lwd=2)
}
\donttest{ ## Reduce test timing
## Splines
f <- function(x) cos(2*x)+x+-0.25*x^2
m <- lvm(x1+x2+x3~eta1, y1+y2+y3~eta2, latent=~eta1+eta2)
functional(m, eta2~eta1) <- f
d <- sim(m,500,seed=1,latent=TRUE)
m1 <- lvm(x1+x2+x3~eta1,latent=~eta1)
m2 <- lvm(y1+y2+y3~eta2,latent=~eta2)
mm <- twostage(m1,m2,formula=eta2~eta1,type="spline")
if (interactive()) plot(mm)
nonlinear(m2,type="quadratic") <- eta2~eta1
a <- twostage(m1,m2,data=d)
if (interactive()) plot(a)
kn <- c(-1,0,1)
nonlinear(m2,type="spline",knots=kn) <- eta2~eta1
a <- twostage(m1,m2,data=d)
x <- seq(-3,3,by=0.1)
y <- predict(a, newdata=data.frame(eta1=x))
if (interactive()) {
plot(eta2~eta1, data=d)
lines(x,y, col="red", lwd=5)
p <- estimate(a,f=function(p) predict(a,p=p,newdata=x))$coefmat
plot(eta2~eta1, data=d)
lines(x,p[,1], col="red", lwd=5)
confband(x,lower=p[,3],upper=p[,4],center=p[,1], polygon=TRUE, col=Col(2,0.2))
l1 <- lm(eta2~splines::ns(eta1,knots=kn),data=d)
p1 <- predict(l1,newdata=data.frame(eta1=x),interval="confidence")
lines(x,p1[,1],col="green",lwd=5)
confband(x,lower=p1[,2],upper=p1[,3],center=p1[,1], polygon=TRUE, col=Col(3,0.2))
}
} ## Reduce test timing
\dontrun{ ## Reduce timing
## Cross-validation example
ma <- lvm(c(x1,x2,x3)~u,latent=~u)
ms <- functional(ma, y~u, value=function(x) -.4*x^2)
d <- sim(ms,500)#,seed=1)
ea <- estimate(ma,d)
mb <- lvm()
mb1 <- nonlinear(mb,type="linear",y~u)
mb2 <- nonlinear(mb,type="quadratic",y~u)
mb3 <- nonlinear(mb,type="spline",knots=c(-3,-1,0,1,3),y~u)
mb4 <- nonlinear(mb,type="spline",knots=c(-3,-2,-1,0,1,2,3),y~u)
ff <- lapply(list(mb1,mb2,mb3,mb4),
function(m) function(data,...) twostage(ma,m,data=data,st.derr=FALSE))
a <- cv(ff,data=d,rep=1)
a
}
}
|