Nothing
## File Name: lsem_residualize.R
## File Version: 0.478
#**** residualize data
lsem_residualize <- function( data, moderator, moderator.grid,
lavmodel, h=1.1, bw=NULL, residualize=TRUE, sampling_weights=NULL,
eps=1E-10, verbose=TRUE, kernel="gaussian", variables_model,
is_imputed=FALSE, Nimp=0 )
{
# lavaanify model
lavaanstr <- sirt_import_lavaan_lavaanify(model=lavmodel)
vars <- variables_model
# values of moderator variable
if (! is_imputed){
data.mod <- data[, moderator, drop=TRUE ]
Nimp <- 1
} else { # use first dataset for imputed data
data.mod <- ( data[[1]] )[, moderator, drop=TRUE ]
}
# compute local weights
res <- lsem_local_weights(data.mod=data.mod, moderator.grid=moderator.grid,
h=h, sampling_weights=sampling_weights, bw=bw, kernel=kernel,
is_imputed=is_imputed, Nimp=Nimp, data=data,
moderator=moderator)
weights <- res$weights
modgrid_index <- res$modgrid_index
N <- res$N
G <- res$G
m.moderator <- res$m.moderator
sd.moderator <- res$sd.moderator
bw <- res$bw
h <- res$h
moderator.density <- res$moderator.density
sampling_weights <- res$sampling_weights
no_sampling_weights <- res$no_sampling_weights
res0 <- as.list(1L:Nimp)
data0 <- data
# residualize
for (ii in 1L:Nimp){
dat2 <- data
if (is_imputed){
dat2 <- data <- data0[[ii]]
}
V <- length(vars)
residualized_intercepts <- matrix( 0, nrow=G, ncol=V)
colnames(residualized_intercepts) <- vars
rownames(residualized_intercepts) <- round( moderator.grid, 3 )
if (residualize){
if (verbose & ii==1){
cat('** Residualize Data\n')
utils::flush.console()
}
N <- nrow(data)
for (vv in 1L:V){
var.vv <- vars[vv]
ind_vv <- which( ! is.na( data[,var.vv] ) )
y0 <- rep(NA,N)
for (gg in 1L:G){
x <- dat2[,moderator]
data1 <- data
data1$x <- x
res_formula <- paste0( var.vv, ' ~ x + I(x^2)' )
if (!is_imputed){
weights_gg <- weights[,gg]
} else {
weights_gg <- (weights[[ii]])[,gg, drop=TRUE]
}
data1$weights_gg <- weights_gg
mod <- stats::lm( formula=res_formula, data=data1,
weights=weights_gg )
dfr_pred <- data.frame( x=moderator.grid[gg] )
m1 <- stats::predict( mod, dfr_pred )
residualized_intercepts[gg,vv] <- m1
y <- stats::resid(mod)
y0[ ind_vv ] <- y
if (!is_imputed){
modgrid_index1 <- modgrid_index
} else {
modgrid_index1 <- modgrid_index[[ii]]
}
dat2[, var.vv] <- ifelse( modgrid_index1==gg, y0, dat2[, var.vv] )
}
} # end vv
} # end residualize=TRUE
res <- list( resid_vars=vars, data=dat2, weights_grid=weights, bw=bw, h=h,
moderator.density=moderator.density, sd.moderator=sd.moderator, G=G, N=N,
residualized_intercepts=residualized_intercepts,
sampling_weights=sampling_weights,
no_sampling_weights=no_sampling_weights,
m.moderator=m.moderator, residualize=residualize,
is_imputed=is_imputed, Nimp=Nimp)
res0[[ii]] <- res
} # end imputation loop ii
#--- process output
if (! is_imputed){
res <- res0[[1]]
} else {
res <- res0[[1]]
entries <- c('data','residualized_intercepts')
for (ee in entries){
v1 <- list()
for (ii in 1L:Nimp){
v1[[ii]] <- res0[[ii]][[ee]]
}
res[[ee]] <- v1
}
#- aggregate residualized intercepts
ee <- 'residualized_intercepts'
res[[ee]] <- lsem_aggregate_statistics(x=res[[ee]])
} # end process output
#-- out
return(res)
}
lsem.residualize <- lsem_residualize
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.