自定义函数报“object not found”错误:聚类稳健标准误函数问题
解决聚类稳健标准误自定义函数的报错问题
报错原因拆解
你遇到的问题核心是R中公式的求值逻辑导致的!当你在函数里写~ clusterby时,R会默认去**模型拟合的原始数据集(也就是你这里的df)**里找名为clusterby的变量,而不是把它当成函数参数clusterby的取值(也就是你传入的foreign)。你的数据里根本没有叫clusterby的列,自然就抛出object 'clusterby' not found的错误啦。
修正后的函数写法
这里给你两种靠谱的修正方式,都能完美解决问题:
方法1:用reformulate构建公式
reformulate可以把变量名转换成对应的公式,非常适配这种场景:
clu <- function(fitmodel, clusterby) { require(multiwayvcov, quietly = TRUE) require(lmtest, quietly = TRUE) # 把传入的聚类变量转换成公式 cluster_formula <- reformulate(deparse(substitute(clusterby))) a <- cluster.vcov(fitmodel, cluster_formula) coeftest(fitmodel, a) }
方法2:用substitute动态生成公式
通过substitute替换公式里的占位符,也能生成正确的聚类公式:
clu <- function(fitmodel, clusterby) { require(multiwayvcov, quietly = TRUE) require(lmtest, quietly = TRUE) # 动态替换生成聚类公式 cluster_formula <- substitute(~ x, list(x = substitute(clusterby))) a <- cluster.vcov(fitmodel, cluster_formula) coeftest(fitmodel, a) }
测试验证
现在运行clu(fit, foreign),就能得到和未封装函数时完全一致的聚类稳健标准误结果啦!
另外补充个小技巧:如果你想让函数同时支持传入变量名和公式(比如clu(fit, ~foreign)),可以稍微调整函数逻辑判断输入类型,但你的原始调用习惯是传变量名,上面两种写法已经完全够用。
内容的提问来源于stack exchange,提问作者letmetype
相关产品推荐
相关产品推荐

