如何解决使用 np 包从数据框中简洁地编写包含多个变量的公式
这与this 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 ~ ",collapse= "+"))
fmla <- as.formula(paste(xnam2,'|x5'))
## This returns an error
bw <- np::npplregbw(formula = fmla,data=df)
这将返回错误“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)。快速修复是 Roland 在评论中给出的一个
eval(bquote(np::npplregbw(formula = .(fmla),data=df)))
更好的修复必须在包端完成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。