使用 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)))
必须在包端完成更好的修复。
这与 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)))
必须在包端完成更好的修复。