2012-07-21 3 views
6

y ~ a*b 양식의 많은 수식 (클래스 formula 또는 Formula)이 있습니다. 여기에서 ab이 요인입니다.수식 내의 확장 요소 상호 작용

이 수식을 사용하고 "상호 작용"의 모든 용어가 포함 된 수식을 반환하는 함수를 작성해야합니다. 다음은 예입니다

fac1 <- factor(c('a', 'a', 'b', 'b')) 
fac2 <- factor(c('c', 'd', 'c', 'd')) 
BigFormula(formula(x ~ fac1*fac2)) 

BigFormula 반환 formula(x ~ a + b + c + d + a:c + a:d + b:c + b:d).

간단한 방법이 있나요?

는 (문맥 : 나는 형태 anova(mod1, mod2), mod2 둥지 mod1에서 여러 명령을 실행하고, 어디 두 모델의 오른쪽은 fac1*fac2 같은 용어가 포함되어 이러한 명령의 요점은 F-통계를 계산하는 것이다. 문제는 anova이 일반적으로 3 개 이상의 변수를 나타내더라도 fac1*fac2을 세 개의 변수로 취급한다는 것입니다. 위 코드에서 fac1*fac2은 8 개의 변수를 나타냅니다. 결과적으로 anova은 중첩 된 변수의 수를 과소 평가합니다. 모델, 그리고 내 자유도를 과대 평가합니다.)

답변

2

다음 해결책은 어떨까요? 나는 복잡한 상호 작용의보다 극단적 인 예를 사용한다.

f = formula(y ~ a * b * c * d * e)

우리가 용어에 의해 반환 된 값에서 용어를 추출, 상호 작용 조건을 밖으로 철자합니다.식() :

> terms 
[1] "a"   "b"   "c"   "d"   "e"   "a:b"  "a:c"  
[8] "b:c"  "a:d"  "b:d"  "c:d"  "a:e"  "b:e"  "c:e"  
[15] "d:e"  "a:b:c"  "a:b:d"  "a:c:d"  "b:c:d"  "a:b:e"  "a:c:e"  
[22] "b:c:e"  "a:d:e"  "b:d:e"  "c:d:e"  "a:b:c:d" "a:b:c:e" "a:b:d:e" 
[29] "a:c:d:e" "b:c:d:e" "a:b:c:d:e" 

을 그리고 우리가 공식으로 다시 변환 할 수 있습니다 :

terms = attr(terms.formula(f), "term.labels")

산출

f = as.formula(sprintf("y ~ %s", paste(terms, collapse="+")))

> f 
y ~ a + b + c + d + e + a:b + a:c + b:c + a:d + b:d + c:d + a:e + 
    b:e + c:e + d:e + a:b:c + a:b:d + a:c:d + b:c:d + a:b:e + 
    a:c:e + b:c:e + a:d:e + b:d:e + c:d:e + a:b:c:d + a:b:c:e + 
    a:b:d:e + a:c:d:e + b:c:d:e + a:b:c:d:e 
0

우리는 비슷한 문제가 있지만 조금 더 쉽게 - 수식에서 우리는 50 개의 변수를 얻었고 매우 자주 바꾸어야했습니다. 우리의 솔루션은 R 스크립트 내에서 외부 파일에 루프를 보내어 실제 수식을 만든 다음 간단한 txt 파일을 읽고 붙여 넣습니다. 늘어나는 루프에서 중첩 된 루프에서 수식을 만들어 파일을 한 줄씩 다시 읽을 수 있다는 것을 기억하십시오. 모두 R 스크립트와 bash를 모두 사용하는 것이 좋습니다.

7

formula에 대한 도움말을 보면 기존에 작동하는 것이있을 수 있습니다.

예를 들어 수식 y ~ (a + b + c + d)^2은 모든 주요 효과와 모든 양방향 상호 작용을 제공하며 수식 y ~ (a + b) * (c + d)은 위에 표시된 확장을 제공합니다. y ~ a*b*c - a:b:c에 3 방향 상호 작용이 포함되지 않도록 용어를 뺄 수 있습니다.

3

는 아직도 식의 모든 트릭을 배울 아직,하지만 난 명시 적 공식을 원하는 경우 내가 붙여 넣기와 sapply 함께 사용하는 경향이 있습니다 :

> f 
[1] "x ~ a + b + c + d + a:c + a:d + b:c + b:d" 
: 우리와 끝까지

# the factors 
fac1 <- factor(c('a', 'a', 'b', 'b')) 
fac2 <- factor(c('c', 'd', 'c', 'd')) 

# create all the interaction terms 
out <- sapply(levels(fac1), function(ii) { 
    sapply(levels(fac2), function(jj) { 
    paste0(ii,":",jj) 
    }) 
}) 
# along with the single terms 
terms <- c(levels(fac1), levels(fac2), as.vector(out)) 

# and create the rhs of the formula 
rhs <- paste0(terms, collapse=" + ") 

# finally add the lhs 
f <- paste0("x ~ ", rhs)