Nothing
#' Pseudo-observation variance sandwich estimator
#'
#' The functions described here all implement an estimator for
#' the variance of the coefficients. This function is not exported.
#'
#' @param U See the formula for sandwich estimator:
#' holds \code{U_{ij}}
#' @param U.diff See the formula for sandwich estimator:
#' holds the partial derivatives of \code{U}.
#' @param g1,g2 Index in the original observations of the "left" and "right" part of the pseudo-observations.
#' @param shared.factor Factor by which all \code{UijUik} or
#' \code{UijUlj} will be multiplied
#' @param switched.factor Factor by which all \code{UijUki} or
#' \code{UijUjl} will be multiplied
#' @param self.factor Factor by which all \code{UijUij} or
#' \code{-UijUji} will be multiplied
#'
#' @return The matrix of the sandwich estimator
#' @aliases score.estimator
sandwich.estimator<-function(U, U.diff,
g1, g2,
shared.factor=1, switched.factor=1,
self.factor=1)
{
#note: this estimator is greatly optimized, based on T Lumley's code!
if(any(fullyequal <- g1==g2 ))
{
#the contribution of these terms to variance and covariance is zero anyway, because
#I_{ii} = 0.5 always (ie: constant), so we drop them out!
U<-U[!fullyequal,,drop=FALSE]
g1<-g1[!fullyequal]
g2<-g2[!fullyequal]
}
usum1.tmp <- rowsum(U,g1,reorder=FALSE)
usum2.tmp <- rowsum(U,g2,reorder=FALSE)
ng <- length(union(g1,g2))
usum1 <- matrix(nrow = ng, ncol = ncol(usum1.tmp),0)
usum2 <- matrix(nrow = ng, ncol = ncol(usum2.tmp),0)
usum1[unique(g1),] <- usum1.tmp
usum2[unique(g2),] <- usum2.tmp
utushared <- crossprod(usum1) + crossprod(usum2)
utuswitched <- crossprod(usum1,usum2) + crossprod(usum2,usum1)
uDiag<-crossprod(U) #Is counted twice as shared.factor, but needs to be counted as self.factor
utu<-shared.factor*utushared +
(switched.factor)*utuswitched +
(self.factor-2*shared.factor)*(uDiag)
#if the inverses occur (ij, ji), they are counted doubly as switched!!
#However: they should be counted as - self
mx<-ng+1
uids<-g1*mx+g2
invuids<-g2*mx+g1
invrowperrow<-match(uids, invuids)
rowsWithInv<-(!is.na(invrowperrow))
if(any(rowsWithInv))
{
rowsWithInv<-which(rowsWithInv)
tmp<-sapply(rowsWithInv, function(ri){
res<-U[ri,] %*% t(U[invrowperrow[ri],])
return(res)
})
if(is.null(dim(tmp)))
{
if(length(rowsWithInv)==1)
{
tmp<-matrix(tmp, ncol=1)
}
else
{
tmp<-matrix(tmp, nrow=1)
}
}
uijji<-matrix(rowSums(tmp), ncol=ncol(usum1.tmp))
utu<-utu-(2 * switched.factor + self.factor)*uijji
}
#skip this last part if U.diff is identity... (note: NULL here will mean identity)
if(is.null(U.diff)) return (utu)
U.diff.inv<-solve(U.diff)
return(U.diff.inv%*%utu%*%U.diff.inv)
}
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.