R - 在公式中转换点 - 点

时间:2013-08-04 06:45:30

标签: r regression lm

我想编写一个可以接受可变数量输入的函数,并在其余输入上回归第一个输入。更具体地说,

假设,假设函数已经提供了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)
}

3 个答案:

答案 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)

应该做的伎俩,但这是未经验证的,所以可能需要一些调整