R函数无法正确接收felm对象作为参数的问题排查
问题原因分析
这个报错的核心是R的环境作用域与统计函数的延迟求值机制冲突:
- 当你在全局环境直接运行代码时,
test_felm是全局环境的对象,sandwich和estfun函数可以通过模型调用(y ~ x + x2)轻松找到全局环境中的变量,也能直接定位到test_felm本身。 - 但在函数内部,你将felm对象命名为
felm_object,而sandwich包针对felm对象的方法实现中,可能使用了substitute()这类函数获取输入对象的名称(此时会得到字符串"felm_object"),然后尝试在全局环境中查找这个名称的对象——但felm_object只存在于函数的局部环境中,因此触发object 'felm_object' not found的错误。
解决方案
这里有两种可靠的解决办法,你可以根据需求选择:
方法1:手动计算得分函数(绕过estfunc的环境问题)
对于线性模型(包括felm拟合的模型),得分函数(estfun的输出)本质是残差 × 模型矩阵的对应行,我们可以手动计算这部分结果,避免调用estfunc触发环境查找:
vcov.adjacency.robust <- function(felm_object, adjacency.matrix) { # 手动计算得分函数,等价于sandwich::estfun(felm_object) model_mat <- model.matrix(felm_object) residuals <- felm_object$residuals eef <- model_mat * residuals 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)
方法2:修改felm对象的调用环境
如果一定要保留estfunc的调用,可以将felm对象的调用环境设置为当前函数的局部环境,让sandwich和estfun能正确找到对象:
vcov.adjacency.robust <- function(felm_object, adjacency.matrix, estfunc=sandwich::estfun) { # 将felm对象的调用环境切换为当前函数环境 environment(felm_object$call) <- environment() 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)
验证结果
两种方法运行后都会得到和你全局环境中一致的输出:
(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
内容的提问来源于stack exchange,提问作者araspion
相关产品推荐
相关产品推荐

