numeric. Vector of residuals, if NULL, a random one is
created.
nowarn
logical. Set to TRUE if is.estimable should not
throw a warning for non-estimable functions.
keepdiff
logical. Return differences between two different runs of
the Kaczmarz method.
threshold
numeric. Threshold for determining estimability.
Details
When writing custom estimable functions for getfe, the
function is.estimable can be used to test it for estimability.
is.estimable() solves the sparse residual system with the Kaczmarz
method, using two different initial values. Then ef() is applied to
the two solutions. If the value of ef() differs by more than
1e-5 in any coordinate, FALSE is returned, otherwise
TRUE is returned. If keepdiff=TRUE, the vector of differences
is attached as an attribute 'diff' to the returned logical value. If
you have problems with estimability, it is a fair guess that those entries
with a difference in absolute values smaller than, say, 1e-5 are
estimable, whereas the others are not.
Value
Returns a logical.
See Also
getfe
Examples
oldopts <- options(lfe.threads=1)
## create individual and firm
id <- factor(sample(5000,50000,replace=TRUE))
firm <- factor(sample(3000,50000,replace=TRUE))
## create some estimable functions. It's faster to
## use numerical indices in ef rather than strings, and the input v
## to ef has no names, we have to add them when requested
ef <- function(v,addnames) {
w <- c(v[6]-v[5],v[7000]+v[5],v[7000]-v[6000])
if(addnames) names(w) <-c('id6-id5','f2k+id5','f2k-f1k')
w
}
is.estimable(ef,list(id=id,firm=firm))
## Then make an error; in the last coordinate, sum two firms
ef <- function(v,addnames) {
w <- c(v[6]-v[5],v[7000]+v[5],v[7000]+v[6000])
if(addnames) names(w) <-c('id6-id5','f2k+id5','f2k-f1k')
w
}
is.estimable(ef, list(id=id,firm=firm), keepdiff=TRUE)
options(oldopts)