2013-08-04 27 views
1

我想編寫一個函數,它可以輸入可變數量的輸入並在其餘輸入中迴歸第一個輸入。更具體地,在公式中R - 轉換點點dot123http:

可以想像,假設功能已經用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

下面是做這件事:

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是DF與柱的x,y,z和你想做的事x ~ y然後:

ff(DF, x, y) 

或X〜Y + Z,則:

ff(DF, x, y, z) 

你明白了。

+0

是的,這適用於像ff(x,y,z,w)這樣的情況。但是,它確實會破壞像ff(t $ x,t $ y,t $ z,t $ w)這樣的情況。這個問題似乎是sapply(mc [ - (1)],as.character)部分 – uday

+0

感謝您的答案 – uday

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) 
+0

我想使用相當於tapply如下 - tapply(egen_neut(x〜y + z),w,FUN) - 不確定這是否有效 – uday

+2

您應該在您的問題中準確添加您想要做的事情。這聽起來像你想要適合一些由某些參數索引的模型。 –

+0

當然,這是我想要做的。我有一個數據框df與分組因子說df $ g和一些更多的變量說df $ x,df $ y,df $ z,df $ w等。我想從df $ x over df $ y或df $ x超過df $ y和df $ z,或者df $ x超過df $ y,df $ z和df $ w等 - 在每個因子df $ g內 - 在一個新變量中調用它說DF $水庫。 – uday

0

如果將所有變量放入數據框中,則可以使用循環來提取列的一個子集和a。在公式對象中,爲數據框中尚未包含在公式中的所有變量擬合添加模型。假設你的數據幀,d,與列X,Y,Z等,然後像

sapply(seq(2, length(d)), function(ix, d) residuals(lm(x ~ ., d[, seq(ix)])), d = d) 

應該做的伎倆,但是這是未經考驗的,所以可能需要一些調整