Nothing
# Wvec
FullResponse.WVec <- function( theta , CountMatrix ) {
##### object formatting
# nummber of categories
K <- dim( CountMatrix )[1] - 1
# Obtain sample estimates of population flows as described in table 3.1 of Rojas et al. (2014)
Nij <- as.matrix( CountMatrix[ -nrow( CountMatrix ) , -ncol( CountMatrix ) ] )
Ri <- CountMatrix[ , ncol(CountMatrix) ][ - nrow( CountMatrix ) ]
Cj <- CountMatrix[ nrow(CountMatrix) , ][ - ncol( CountMatrix ) ]
M <- CountMatrix[ nrow( CountMatrix ) , ncol( CountMatrix ) ]
N <- sum( Nij ) + sum( Ri ) + sum( Cj ) + M
# rebuild parameters form vector theta
eta <- theta[ seq_len( K ) ]
pij <- theta[ K + seq_len(K^2) ]
# rebuild matrices
pij <- matrix( pij , ncol = K , nrow = K , byrow = TRUE )
# intermediate computations
nipij <- sweep( pij , 1 , eta , "*" )
##### estimating equations (Binder's W vector)
# psi
Wpsi <- 0
# rho
Wrho <- 0
# tau
Wtau <- 0
# eta
Weta <- ( rowSums( Nij ) / eta ) - N
# pij (unrestricted)
Wpij <- (Nij / pij)
# pij = zero
Wpij[ is.na( Wpij ) ] <- 0
# lambda2 restriction
lambda2 <- -( rowSums( Nij ) / N )
Wpij <- sweep( Wpij , 1 , N*lambda2 , "+" )
# build Wvec
c( Weta , t( Wpij ) )
}
# function for variance calculation under full response
FullResponse.linearization <- function( xx , ww , res , design ) {
# load objects
Amat <- res[["observed.counts"]]
K <- sqrt( prod( dim( Amat ) ) ) - 1
this.theta <- c( unlist( res[ "eta" ] ) , t( res[[ "pij" ]] ) )
Nij <- Amat[ seq_len( K ) , seq_len( K ) ]
N <- sum( Amat )
eta <- res[["eta"]]
pij <- res[["pij"]]
muij <- res[["muij"]]
Kmat <- matrix( seq_len( prod( dim( Nij ) ) ) , nrow = nrow( Nij ) , byrow = TRUE )
# yy array - see Rojas et al. (2014, p.294)
yy <- array( 0 , dim = c( nrow( xx ) , nrow( Nij ) , ncol( xx ) ) )
for ( r in seq_len( ncol( xx ) ) ) {
kk <- stats::model.matrix( ~-1+. , data = xx[,r,drop = FALSE] , contrasts.arg = lapply( xx[,r, drop = FALSE ] , stats::contrasts, contrasts=FALSE ) , na.action = stats::na.pass )
yy[ which( !is.na( xx[ , r ] ) ) , , r ] <- kk ; rm( kk )
}
# Special variables - see Rojas et al. (2014, p.295)
y1y2 <- array( 0 , dim = c( nrow( xx ) , nrow( Nij ) , ncol( Nij ) ) )
for ( i in seq_len( nrow( Nij ) ) ) for ( j in seq_len( ncol( Nij ) ) ) y1y2[,i,j] <- yy[,i,1] * yy[,j,2]
# calculate auxiliary stats
nipij <- sweep( pij , 1 , eta , "*" )
### eta
# Calculate scores for estimating the variance of eta parameters
u.eta <- array( 0 , dim = c( nrow(xx) , nrow( Nij ) ) )
for ( i in seq_len( nrow( Nij ) ) ) {
u.eta[,i] <- rowSums( y1y2[,i,] ) / eta[i] - 1
}
### pij
# Calculate scores for estimating the variance of pij parameters
a.pij <- array( 0 , dim = c( nrow( xx ) , nrow( Nij ) , ncol( Nij ) ) )
for ( i in seq_len( nrow( Nij ) ) ) for ( j in seq_len( ncol( Nij ) ) ) {
a.pij[,i,j] <- ( y1y2[,i,j] / pij[i,j] )
}
# lambda2 restriction
lambda2 <- -( rowSums( Nij ) / N )
a.pij <- sweep( a.pij , 2 , lambda2 , "+" )
# pij = zero
pij.zero.mat <- which( pij == 0 , arr.ind = TRUE )
for ( k in seq_len( nrow( pij.zero.mat ) ) ) a.pij[ , pij.zero.mat[k,1] , pij.zero.mat[k,2] ] <- 0
# coerce to matrix
u.pij <- matrix( 0 , nrow = dim( a.pij )[1] , ncol = K^2 , byrow = TRUE )
for ( i in seq_len( nrow( Nij ) ) ) u.pij[,Kmat[i,]] <- a.pij[,i,]
### matrix of linearized variables
# build Umat
Umat <- do.call( cbind , list( u.eta , u.pij ) )
### calculate jacobian
# jacobian matrix
Jmat <- numDeriv::jacobian( FullResponse.WVec , this.theta , method = "complex" , side = NULL , CountMatrix = Amat )
# inverse of the jacobian matrix
Jmat.inv <- MASS::ginv( Jmat )
# calculate variance
Umat.adj <- t( apply( Umat , 1 , function(z) crossprod( t(Jmat.inv) , z ) ) )
u.eta <- Umat.adj[ , seq_len(K) ]
u.pij <- Umat.adj[ , K + seq_len(K^2) ]
u.pij[ , which( t( pij ) == 0 , arr.ind = FALSE ) ] <- 0
a.pij <- array( 0 , dim = c( nrow( xx ) , nrow( Nij ) , ncol( Nij ) ) )
for ( i in seq_len( ncol( Nij ) ) ) {
a.pij[,i,] <- u.pij[ , Kmat[ i , ] ]
}
##### other variances
# net flows
u.nipij <- array( 0 , dim = c( nrow( xx ) , nrow( Nij ) , ncol( Nij ) ) )
for ( i in seq_len( nrow(Nij) ) ) for ( j in seq_len( ncol( Nij ) ) ) {
u.nipij[,i,j] <- ( pij[i,j] * u.eta[,i] + eta[i] * a.pij[,i,j] )
}
# gross flows
a.muij <- array( 0 , dim = c( nrow( xx ) , nrow( Nij ) , ncol( Nij ) ) )
for ( i in seq_len( nrow(Nij) ) ) for ( j in seq_len( ncol( Nij ) ) ) {
a.muij[,i,j] <- N * u.nipij[,i,j] + nipij[i,j]
}
u.muij <- matrix( 0 , nrow = dim( a.muij )[1] , ncol = K^2 , byrow = TRUE )
for ( i in seq_len( nrow( Nij ) ) ) u.muij[,Kmat[i,]] <- a.muij[,i,]
rm( a.muij )
# final distribution
u.gamma <- apply( u.nipij , c(1,3) , sum )
for ( j in seq_len( nrow( Nij ) ) ) u.gamma[,j] <- rowSums( u.nipij[,,j] )
# delta
delta <- N * ( colSums( nipij ) - eta )
u.delta <- sweep( N * ( u.gamma - u.eta ) , 2 , ( colSums( nipij ) - eta ) , "+" )
##### split full matrix
# build list of linearized variables
llin <-
list(
"eta" = u.eta ,
"pij" = u.pij ,
"muij" = u.muij ,
"gamma" = u.gamma ,
"delta" = u.delta )
# return list
return( llin )
}
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.