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参数校验报错。
修复方法
- 统一参数命名:将
return.model.gmm中笔误的形参mtransformation改为transformation,和内外部调用的参数名保持一致。 - 传参时显式声明参数名,不要依赖位置匹配,从根源避免顺序错位问题。
- 可选优化:拼接的模型公式显式转为
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
相关产品推荐
相关产品推荐

