【问题标题】:R function not properly taking felm object as argumentR函数没有正确地将felm对象作为参数
【发布时间】:2020-04-29 14:35:52
【问题描述】:

我正在尝试编写一个将 felm 对​​象作为参数的 R 函数。该函数似乎无法识别函数内部的 felm 对​​象,但是,如果我在函数外部运行代码,它就可以正常工作。有人可以帮我理解为什么这不起作用吗?谢谢!下面的可重现示例。

library(sandwich)
library(lfe)
set.seed(2020)
x <- rnorm(1000)
x2 <- rnorm(length(x))
y <- x + 0.5*x2
adj_test <- diag(1, 1000, 1000)
test_felm <- felm(y ~ x + x2 | 0 | 0 | 0)

vcov.adjacency.robust <- function(felm_object, adjacency.matrix, estfunc=sandwich::estfun) {
  eef <- estfunc(felm_object)

  N <- nrow(adjacency.matrix)
  m <- crossprod(eef, adjacency.matrix %*% eef)

  sandwich(felm_object, meat = as.matrix(m) / N)
}

vcov.adjacency.robust(test_felm, adj_test)
Error in model.matrix(x) : object 'felm_object' not found 
eef <- sandwich::estfun(test_felm)
N <- nrow(adj_test)
m <- crossprod(eef, adj_test %*% eef)
sandwich(test_felm, meat = as.matrix(m) / N)

             (Intercept)            x           x2
(Intercept) 2.772862e-33 2.615412e-34 2.335601e-35
x           2.615412e-34 7.750617e-33 7.657461e-34
x2          2.335601e-35 7.657461e-34 2.947959e-33

【问题讨论】:

    标签: r


    【解决方案1】:

    sandwich::estfun 正在调用一个方法,

    sandwich::estfun
    # function (x, ...) 
    # {
    #   UseMethod("estfun")
    # }
    # <bytecode: 0x00000000142bb260>
    #   <environment: namespace:sandwich>
    

    并且该方法似乎无法在函数中访问。所以直接调用正确的函数,即sandwich:::estfun.lm,可以解决问题。

    vcov.adjacency.robust <- function(felm_object, adjacency.matrix, 
                                      estfunc=sandwich:::estfun.lm) {
      eef <- estfunc(felm_object)
      N <- nrow(adjacency.matrix)
      m <- crossprod(eef, adjacency.matrix %*% eef)
      sandwich(felm_object, meat = as.matrix(m) / N)
    }
    
    (res <- vcov.adjacency.robust(test_felm, adj_test))
    #              (Intercept)            x           x2
    # (Intercept) 2.772862e-33 2.615412e-34 2.335601e-35
    # x           2.615412e-34 7.750617e-33 7.657461e-34
    # x2          2.335601e-35 7.657461e-34 2.947959e-33
    
    eef <-  estfun(test_felm)
    N <- nrow(adj_test)
    m <- crossprod(eef, adj_test %*% eef)
    check <- sandwich(test_felm, meat = as.matrix(m) / N)
    
    stopifnot(all.equal(res, check))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多