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

R语言调用plm包pgmm运行GMM模型报effect参数错误排查

R plm包自定义pgmm函数运行报错排查

问题描述

基于R语言plm包的pgmm函数封装了可重复运行GMM模型的自定义函数,代码如下:

run.gmm <- function(data,
              predictor,
              dep,
              controls,
              row.name = predictor,
              add.controls = NULL,
              rm.controls = NULL,
              caption = NULL, model, effect, transformation) {
     gmodel <-
              return.model.gmm(data,
                 predictor,
                 dep,
                 controls,
                 add.controls,
                 rm.controls, model, effect, transformation)
    if (Console == T) {
       print(summary(gmodel, robust = TRUE, time.dummies = TRUE))
     }
      invisible(gmodel)
      }

return.model.gmm <- function(data, predictor, dep, controls, add.controls = NULL, 
                                  rm.controls = NULL, effect, model, mtransformation) {
                 controls <- controls[!controls %in% rm.controls]
                 controls <- paste("lag(", c(controls, add.controls), ",1)", collapse = " + ")
                 predictors <- paste(predictor, controls, sep = " + ")
                 formula <- paste(dep, predictors, sep = " ~ ")
                 gmmodel <- pgmm(formula, paste("|", controls), data = data, effect = effect, 
                             model = model, transformation = transformation)
                 return(gmmodel)
         } 

使用如下参数调用函数:

my.controls <- c("lnPDENS", "GDPGR", "LFSGR", 'GRRAT')
my.predictor = paste("lag(", c("LaPGrowth", "SRate"), ",1)", collapse = " + ")
my.effect <- c("twoways")
my.model <- c("twosteps")
my.transformation <- c("ld")

run.gmm(data=pdata.lbprt, dep="LaPGrowth", predictor = my.predictor, controls = my.controls, effect=my.effect, 
       model=my.model, transformation=my.transformation)

运行后抛出报错:

Error in match.arg(effect) : 
'arg' should be one of “twoways”, “individual”

该问题无需样本数据即可完成定位。

错误根因

代码存在两处明确问题,直接触发报错的是第二处参数顺序错位:

  • 形参命名笔误:return.model.gmm定义时最后一个形参写为mtransformation,但函数内部调用pgmm时传入的是未在该函数内定义的transformation,参数名不匹配。
  • 位置传参顺序错误:run.gmm中调用return.model.gmm时,rm.controls之后传入的参数顺序是model, effect, transformation,但return.model.gmm定义的形参顺序在rm.controls之后为effect, model, mtransformation。这就导致传入的model参数值"twosteps"被赋值给了effect形参,传入的effect参数值"twoways"被赋值给了model形参。最终pgmm收到的effect参数值为"twosteps",不在其要求的c("twoways", "individual")可选值范围内,触发match.arg参数校验报错。

修复方法

  1. 统一参数命名:将return.model.gmm中笔误的形参mtransformation改为transformation,和内外部调用的参数名保持一致。
  2. 传参时显式声明参数名,不要依赖位置匹配,从根源避免顺序错位问题。
  3. 可选优化:拼接的模型公式显式转为formula对象;判断Console开关前先确认对象存在,避免未定义Console时额外报错。

修复后的可运行代码:

run.gmm <- function(data,
              predictor,
              dep,
              controls,
              row.name = predictor,
              add.controls = NULL,
              rm.controls = NULL,
              caption = NULL, model, effect, transformation) {
     # 显式指定参数名传参,彻底避免顺序错位
     gmodel <- return.model.gmm(
                 data = data,
                 predictor = predictor,
                 dep = dep,
                 controls = controls,
                 add.controls = add.controls,
                 rm.controls = rm.controls, 
                 model = model, 
                 effect = effect, 
                 transformation = transformation
               )
    # 补充Console存在性判断,避免环境无该变量时报错
    if (exists("Console") && Console == TRUE) {
       print(summary(gmodel, robust = TRUE, time.dummies = TRUE))
    }
    invisible(gmodel)
}

return.model.gmm <- function(data, predictor, dep, controls, add.controls = NULL, 
                                  rm.controls = NULL, effect, model, transformation) {
                 controls <- controls[!controls %in% rm.controls]
                 controls <- paste("lag(", c(controls, add.controls), ",1)", collapse = " + ")
                 predictors <- paste(predictor, controls, sep = " + ")
                 formula <- paste(dep, predictors, sep = " ~ ")
                 # 显式转换为formula对象,避免字符串传参的潜在兼容问题
                 gmmodel <- pgmm(
                             as.formula(formula), 
                             as.formula(paste("~ . |", controls)), 
                             data = data, 
                             effect = effect, 
                             model = model, 
                             transformation = transformation
                           )
                 return(gmmodel)
} 

内容的提问来源于stack exchange,提问作者Abdullah Mamun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:36:17