我想编写一个可以接受可变数量输入的函数,并在其余输入上回归第一个输入。更具体地说,
假设,假设函数已经提供了2或3或4个变量,我将其定义为:
egen_neut<-function(x,y) residuals(lm(x~y,na.action=na.exclude)
egen_neut<-function(x,y,z) residuals(lm(x~y+z,na.action=na.exclude)
egen_neut<-function(x,y,z,w) residuals(lm(x~y+z+w,na.action=na.exclude)
如何转换点 - 点,即“...”,这样它可以解释为变量之间带有“+”的公式,即代替??? ??以下
egen_neut<-function(x,...) {
residuals(lm(x ~ ?????,na.action=na.exclude)
}
答案 0 :(得分:3)
这是一种方法:
ff <- function(x, ...) {
mc <- as.list(match.call())[-1]
ll <- as.character(mc[[1]])
rr <- paste(sapply(mc[-(1)], as.character), collapse="+")
fm <- as.formula(paste(ll, "~", rr))
# now you can execute `lm` as:
lm(fm, na.action = na.exclude)
}
# now you can do
ff(x, y, z, w)
其中所有这些输入变量都驻留在全局环境中。希望这会有所帮助。
由于您正在处理data.frame
,我就是这样做的:
ff <- function(df, ...) {
mc <- as.list(match.call())[-(1:2)]
ll <- as.character(mc[[1]])
rr <- paste(sapply(mc[-(1)], as.character), collapse="+")
fm <- as.formula(paste(ll, "~", rr))
# now you can execute `lm` as:
lm(fm, data = df, na.action = na.exclude)
}
假设您的data.frame是带有x,y,z列的DF,并且您想要x ~ y
那么:
ff(DF, x, y)
或x~y + z,然后:
ff(DF, x, y, z)
你明白了。
答案 1 :(得分:1)
你不必这样做。只需编写函数来获取公式参数:
egen_neut <- function(fm)
resid(lm(fm, na.action=na.exclude))
egen_neut(x ~ y)
egen_neut(x ~ y + z)
egen_neut(x ~ y + z + w)
答案 2 :(得分:0)
如果将所有变量放入数据框中,则可以使用循环来提取列的子集和a。在公式对象中,将加法模型拟合到公式中尚未包含的数据框中的所有变量。假设您的数据框d为x,y,z等列。然后是
sapply(seq(2, length(d)), function(ix, d) residuals(lm(x ~ ., d[, seq(ix)])), d = d)
应该做的伎俩,但这是未经验证的,所以可能需要一些调整