R: Verify estimability of function

is.estimable {lfe} | R Documentation

## Verify estimability of function

### Description

Verify that a function you have written for `getfe` is indeed estimable.

### Usage

    is.estimable(
      ef,
      fe,
      R = NULL,
      nowarn = FALSE,
      keepdiff = FALSE,
      threshold = 500 * getOption("lfe.eps")
    )

### Arguments

`ef` | function. The function to be verified.
`fe` | list of factors.
`R` | 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")
    options(lfe.threads = 2)
    ## 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)

[Package lfe version 2.8-7 Index]