使用 np 包从数据框中简洁地编写一个包含许多变量的公式

Succinctly write a formula with many variables from a data frame with np package

这与 this post 有关。

我想简洁地写一个有很多变量的公式来估计一个非参数模型,我使用了上面post提供的方法。但是,我发现它不适用于 np::npplregbw.

首先,线性模型中的公式运行良好

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10),x3=rnorm(10),x4=rnorm(10),
               x5=rnorm(10))

## Create a formula for a model with a large number of variables:
xnam <- paste("x", 1:4, sep="")
fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+")))

## This works
m <- lm(formula = fmla, data=df)

但是,如果我们从上面的代码继续下去,并尝试得到一个适合np:npplregbw

的公式
xnam2 <- paste("y ~ ", paste(xnam, collapse= "+"))
fmla <- as.formula(paste(xnam2, '|x5'))

## This returns an error
bw <- np::npplregbw(formula = fmla, data=df)

这 returns 一个错误“npplregbw.formula(fmla, data = df) 中的错误: 使用不正确的公式调用,请参阅 npplregbw 文档以正确使用

但公式本身应该有效,如下所示

print(fmla) ## Gets y ~ x1 + x2 + x3 + x4 | x5

## This also works
bw <- np::npplregbw(y ~ x1 + x2 + x3 + x4 | x5, data=df)

有人可以解释为什么会发生这种情况以及如何解决这个问题吗?

错误来自 matchc.call npplregbw.formula, invoked by npplregbw` 的不当使用。在前几行代码中抛出错误

npplregbw.formula <- function (formula, data, subset, na.action, call, ...) 
{
  mf <- match.call(expand.dots = FALSE)
  m <- match(c("formula", "data", "subset", "na.action"), 
    names(mf), nomatch = 0)
  mf <- mf[c(1, m)]
  if (!missing(call) && is.call(call)) {
    for (i in 1:length(call)) {
      if (tryCatch(class(eval(call[[i]])) == "formula", 
        error = function(e) FALSE)) 
        break
    }
    mf[[2]] <- call[[i]]
  }
  mf.xf <- mf
  mf[[1]] <- as.name("model.frame")
  mf.xf[[1]] <- as.name("model.frame")
  chromoly <- explodePipe(mf[["formula"]])
  if (length(chromoly) != 3) 
    stop("invoked with improper formula, please see npplregbw documentation for proper use")
  ...
}

注意一个小例子:

foo <- function(formula){
  mf <- match.call(expand.dots = FALSE)
  mf[["formula"]]
}
foo(fmla)
fmla # <=== output line

这绝对是一个需要报告的问题 (opened here)。快速修复是罗兰在评论中给出的

eval(bquote(np::npplregbw(formula = .(fmla), data=df)))

必须在包端完成更好的修复。