STA313 F 2004 Handout 4
Simple Regression SEM with R
# simplereg.R R --vanilla < simplereg.R
# Simple regression SEM
#
# Simulate some data
set.seed(444)
x <- rnorm(250,0,2) ; y <- rnorm(250,0,3)
XY <- cbind(x,y)
#
# Define functions
#
source("mvnLL.R")
simplereg1 <- function(theta,datta) # Full (unrestricted) moel
{ # theta = (sigmaXX,sigmaUU,b)
# Elements of the covariance matrix are functions of the parameter vector
sig11 <- theta[1] ; sig12 <- theta[3]*theta[1]
sig22 <- theta[3]^2*theta[1] + theta[2]
# Bind the covariance elements into a matrix
covmat <- rbind( c(sig11,sig12),
c(sig12,sig22) )
simplereg1 <- mvnLL(covmat,datta)
simplereg1
} # End of simplereg1
simplereg0 <- function(theta,datta) # Reduced (restricted) moel
{ # theta = (sigmaXX,sigmaUU,b)
# Elements of the covariance matrix are functions of the parameter vector
sig11 <- theta[1] ; sig22 <- theta[2]
# Bind the covariance elements into a matrix
covmat <- rbind( c(sig11, 0),
c( 0,sig22) )
simplereg0 <- mvnLL(covmat,datta)
simplereg0
} # End of simplereg0
# Get starting values for the full model
Shat <- var(XY) ; Shat
# start1 contins MOM estimates for theta = (sigmaXX,sigmaUU,b)
start1 <- numeric(3)
start1[1] <- Shat[1,1]
start1[2] <- Shat[2,2] - Shat[1,2]^2/Shat[1,1]
start1[3] <- Shat[1,2]/Shat[1,1]
start1
Full <- nlm(simplereg1,start1,datta=XY) ; Full
Red <- nlm(simplereg0,c(var(x),var(y)),datta=XY) ; Red
G <- Red$minimum - Full$minimum
pval <- 1-pchisq(G,1)
G ; pval
# Compare common regression through origin
summary(lm(y~-1+x))
# Use the regression to get nice starting values
var(x)
start2 <- c(4.021413,3.047^2,-0.04720)
rbind(start1,start2)
Full2 <- nlm(simplereg1,start2,datta=XY)
rbind(Full$estimate,Full2$estimate)
> # simplereg.R R --vanilla < simplereg.R
> # Simple regression SEM
> #
> # Simulate some data
> set.seed(444)
> x <- rnorm(250,0,2) ; y <- rnorm(250,0,3)
> XY <- cbind(x,y)
> #
> # Define functions
> #
> source("mvnLL.R")
> simplereg1 <- function(theta,datta) # Full (unrestricted) moel
+ { # theta = (sigmaXX,sigmaUU,b)
+ # Elements of the covariance matrix are functions of the parameter vector
+ sig11 <- theta[1] ; sig12 <- theta[3]*theta[1]
+ sig22 <- theta[3]^2*theta[1] + theta[2]
+ # Bind the covariance elements into a matrix
+ covmat <- rbind( c(sig11,sig12),
+ c(sig12,sig22) )
+ simplereg1 <- mvnLL(covmat,datta)
+ simplereg1
+ } # End of simplereg1
>
> simplereg0 <- function(theta,datta) # Reduced (restricted) moel
+ { # theta = (sigmaXX,sigmaUU,b)
+ # Elements of the covariance matrix are functions of the parameter vector
+ sig11 <- theta[1] ; sig22 <- theta[2]
+ # Bind the covariance elements into a matrix
+ covmat <- rbind( c(sig11, 0),
+ c( 0,sig22) )
+ simplereg0 <- mvnLL(covmat,datta)
+ simplereg0
+ } # End of simplereg0
>
> # Get starting values for the full model
> Shat <- var(XY) ; Shat
x y
x 4.0214134 -0.1101015
y -0.1101015 9.1585168
> # start1 contins MOM estimates for theta = (sigmaXX,sigmaUU,b)
> start1 <- numeric(3)
> start1[1] <- Shat[1,1]
> start1[2] <- Shat[2,2] - Shat[1,2]^2/Shat[1,1]
> start1[3] <- Shat[1,2]/Shat[1,1]
> start1
[1] 4.02141339 9.15550239 -0.02737881
>
> Full <- nlm(simplereg1,start1,datta=XY) ; Full
$minimum
[1] 2318.432
$estimate
[1] 4.00532405 9.11887424 -0.02737932
$gradient
[1] -2.611322e-05 -4.687668e-06 -2.728484e-06
$code
[1] 1
$iterations
[1] 6
> Red <- nlm(simplereg0,c(var(x),var(y)),datta=XY) ; Red
$minimum
[1] 2318.514
$estimate
[1] 4.005338 9.121846
$gradient
[1] 1.938048e-04 -9.726234e-05
$code
[1] 1
$iterations
[1] 6
>
> G <- Red$minimum - Full$minimum
> pval <- 1-pchisq(G,1)
> G ; pval
[1] 0.08229895
[1] 0.7742058
>
> # Compare common regression through origin
> summary(lm(y~-1+x))
Call:
lm(formula = y ~ -1 + x)
Residuals:
Min 1Q Median 3Q Max
-6.6348 -1.8367 0.3149 2.2161 9.3319
Coefficients:
Estimate Std. Error t value Pr(>|t|)
x -0.04720 0.09568 -0.493 0.622
Residual standard error: 3.047 on 249 degrees of freedom
Multiple R-Squared: 0.0009766, Adjusted R-squared: -0.003036
F-statistic: 0.2434 on 1 and 249 DF, p-value: 0.6222
>
> # Use the regression to get nice starting values
>
> var(x)
[1] 4.021413
> start2 <- c(4.021413,3.047^2,-0.04720)
> rbind(start1,start2)
[,1] [,2] [,3]
start1 4.021413 9.155502 -0.02737881
start2 4.021413 9.284209 -0.04720000
> Full2 <- nlm(simplereg1,start2,datta=XY)
> rbind(Full$estimate,Full2$estimate)
[,1] [,2] [,3]
[1,] 4.005324 9.118874 -0.02737932
[2,] 4.005329 9.118906 -0.02737937
>