2013-08-04 2 views
1

가변 개수의 입력을 받아 들여 나머지 입력의 첫 번째 입력을 회귀 할 수있는 함수를 작성하고 싶습니다. 나는이 점 점 점 즉, "변환 할 수있는 방법을R - 수식의 도트 - 도트 도트 변환

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) 

: 더 구체적으로,

꼽은은 함수가 2 개 또는 3 또는 4 변수와 함께 제공되어 있다고 가정, 내가로 정의한다. .. "와 같이 변수 사이에"+ "가있는 수식으로 해석 될 수 있습니다. 즉, ??? 이하

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가 열 X, Y, Z와 DF 가정 해 당신이하고 싶은 다음 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)와 같은 경우에는 고장이 발생합니다. 문제는 답답함 (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 $ g와 몇 가지 변수가 df $ x, df $ y, df $ z, df $ w 등을 말하고있는 그룹화 요소를 가진 데이터 프레임 df를 가지고 있습니다. df $ x의 회귀로부터 잔차를 얻고 싶습니다. df $ y 또는 df $ x에 df $ y 또는 df $ z 또는 df $ x에 df $ y, df $ z 및 df $ w 등 - df $ g - 각 변수 df $ g - 새로운 변수 호출 df $ res. – uday

0

모든 변수를 데이터 프레임에 넣으면 루프를 사용하여 열과 하위 집합을 추출 할 수 있습니다. 수식에 아직없는 데이터 프레임의 모든 변수에 덧셈 모델을 맞추는 수식 개체 그런 다음

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

같은 트릭을 할해야 열 X, Y, Z 등을 사용하여 데이터 프레임, D를, 가정,하지만 내가 사용하려는 일부 조정