You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:07:47