2010-03-11 7 views
7

lm() 또는 glm() 및 친구와 비슷한 첫 번째 인수로 수식을 허용하는 R 함수를 작성하고 싶습니다. 예조건부 정보에서 정보 추출

<line> .=. <target> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info> 
<target> .=. +1 | -1 | 0 | <float> 
<feature> .=. <integer> | "qid" 
<value> .=. <float> 
<info> .=. <string> 

다음 데이터 프레임 :이 경우에, 데이터 프레임을 얻어이 일반적인 형태 갖는다 SVMLight 포맷의 파일을 기록하는 기능이다

result qid  f1  f2  f3  f4 f5  f6  f7  f8 
1  -1 1 0.0000 0.1253 0.0000 0.1017 0.00 0.0000 0.0000 0.9999 
2  -1 1 0.0098 0.0000 0.0000 0.0000 0.00 0.0316 0.0000 0.3661 
3  1 1 0.0000 0.0000 0.1941 0.0000 0.00 0.0000 0.0509 0.0000 
4  -1 2 0.0000 0.2863 0.0948 0.0000 0.34 0.0000 0.7428 0.0608 
5  1 2 0.0000 0.0000 0.0000 0.4347 0.00 0.0000 0.9539 0.0000 
6  1 2 0.0000 0.7282 0.9087 0.0000 0.00 0.0000 0.0000 0.0355 

를 것

-1 qid:1 2:0.1253 4:0.1017 8:0.9999 
-1 qid:1 1:0.0098 6:0.0316 8:0.3661 
1 qid:1 3:0.1941 7:0.0509 
-1 qid:2 2:0.2863 3:0.0948 5:0.3400 7:0.7428 8:0.0608 
1 qid:2 4:0.4347 7:0.9539 
1 qid:2 2:0.7282 3:0.9087 8:0.0355 

나는 이런 식으로 뭔가를 호출 할 것이다 쓰기하고 싶은 기능 : 다음과 같이 표현 될

write.svmlight(result ~ f1+f2+f3+f4+f5+f6+f7+f8 | qid, data=mydata, file="out.txt") 

심지어

write.svmlight(result ~ . | qid, data=mydata, file="out.txt") 

하지만이 작성되어 있는지 열 알고 model.matrix() 및/또는 model.frame()을 사용하는 방법을 알아낼 수 없습니다. 이것들이 옳은 것들을보고있는 것입니까?

많은 도움을 주셨습니다.

답변

4

부분적인 대답. 당신은 식의 구문 분석 트리를 얻을 수있는 공식 객체를 첨자 수 있습니다

> f<-a~b+c|d 
> f[[1]] 
`~` 
> f[[2]] 
a 
> f[[3]] 
b + c | d 
> f[[3]][[1]] 
`|` 
> f[[3]][[2]] 
b + c 
> f[[3]][[3]] 
d 

이제 당신이 필요로하는 모든이 트리를 걸어 코드입니다.

업데이트 : 다음은 트리를 탐색하는 함수의 예입니다.

walker<-function(formu){ 
    if (!is(formu,"formula")) 
    stop("Want formula") 
    lhs <- formu[[2]] 
    formu <- formu[[3]] 

    if (formu[[1]]!='|') 
    stop("Want conditional part") 

    condi <- formu[[3]] 

    flattener <- function(f) {if (length(f)<3) return(f); 
          c(Recall(f[[2]]),Recall(f[[3]]))} 
    vars <- flattener(formu[[2]]) 

    list(lhs=lhs,condi=condi,vars=vars) 
} 

walker(y~a+b|c) 

또한 terms.formulaterms.object에 대한 설명서를 봐주세요. 예를 들어, 조건식을 사용하는 몇 가지 함수에 대한 코드를 보면 도움이 될 수 있습니다. lmer 기능은 lme4 패키지에 있습니다.

+0

ㅎ - 예, 나무를 걷는 것은 실제로 "필요한 모든 것"입니다. =) 나는 lmer()를 보았지만 파싱을하는'lmerFrames()'메서드가 숨겨져 있으므로 소스 패키지를 가져와야 할 것이다. 또는 이와 같은 S4 메소드의 코드를 볼 수있는 방법이 있습니까? –

+0

이제'lmerFrames()'등등의 소스를 보았습니다. 얼마나 운 좋은지. 저는 항상 수식을 다루는 더 매끄러운 방법이 있다고 가정했습니다. –

+1

:::를 사용하여 네임 스페이스의 내보내기되지 않은 함수를 참조 할 수 있습니다. lme4 ::: lmerFrames. 나무를 걷는 함수를 포함하도록 답변을 업데이트했으며, 지금은 많은 입력 검사를하지 않습니다. –

0

나는 내가 프리드먼 시험에 대한 사후을하고 쓴 코드에서

formu.names <- all.vars(formu) 
Y.name <- formu.names[1] 
X.name <- formu.names[2] 
block.name <- formu.names[3] 

을 사용 :

http://www.r-statistics.com/2010/02/post-hoc-analysis-for-friedmans-test-r-code/

그러나 그것은 단지에 대한 작동합니다 Y`X | 블록을

다른 사람들이 더 잘 답변 할 수 있기를 바랍니다.