2017-11-29 8 views
1

R에서 DirichReg 패키지를 사용하여 수식 개체를 Dirichlet 회귀로 전달하려고합니다. 아래 그림과 같이 패키지가 수식을 받아들이지 않는 것 같습니다. 이 형식으로되어 있지만 설명서의 어떤 것도이 제한 사항에 유의하지 않습니다. 이 워크 플로의 이유는 서로 다른 공식 (다른 공변량의 IE)에 적용 할 수있는 교차 유효성 검사 기능을 설정하고 모델 선택에 도움이되는 샘플 외부 예측 기능을 반환하기 위해서입니다.수식 개체를 DirichReg에 전달하는 방법 (기능 설정)

library (DirichletReg) 

df <- ArcticLake # plug-in your data here 
df$Y <- DR_data(df[,1:3]) # prepare the Y's 
Warning in DR_data(df[, 1:3]) : 
    not all rows sum up to 1 => normalization forced 

formula <- reformulate(termlabels = "depth", response="Y") 

mod <- DirichReg(formula, df) 

Error: object of type 'symbol' is not subsettable 
Error during wrapup: 

mod <- DirichReg(Y~depth, df) 

str(Y~depth) 

Class 'formula' language Y ~ depth 
    ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 

str(formula) 

Class 'formula' language Y ~ depth 
    ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 

formula <- as.formula("Y~depth") 
mod <- DirichReg(formula, df) 

Error: object of type 'symbol' is not subsettable 
Error during wrapup: 

작동중인 DirichReg 호출에 지정된대로 '수식'개체와 수식간에 차이가없는 것 같습니다.

내 생각에 응답 변수는 DR_data 명령을 사용하여 형식이 지정되는 방식과 관련이 있지만 함수에서 즉시 수식을 지정하는 방법을 알 수는 없습니다.

> str(df$Y) 
DirichletRegData [1:39, 1:3] 0.775 0.719 0.507 0.524 0.7 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:39] "1" "2" "3" "4" ... 
    ..$ : chr [1:3] "sand" "silt" "clay" 
- attr(*, "Y.original")='data.frame': 39 obs. of 3 variables: 
    ..$ sand: num [1:39] 0.775 0.719 0.507 0.522 0.7 0.665 0.431 0.534 0.155 0.317 ... 
    ..$ silt: num [1:39] 0.195 0.249 0.361 0.409 0.265 0.322 0.553 0.368 0.544 0.415 ... 
    ..$ clay: num [1:39] 0.03 0.032 0.132 0.066 0.035 0.013 0.016 0.098 0.301 0.268 ... 
- attr(*, "dims")= int 3 
- attr(*, "dim.names")= chr [1:3] "sand" "silt" "clay" 
- attr(*, "obs")= int 39 
- attr(*, "valid_obs")= int 39 
- attr(*, "normalized")= logi TRUE 
- attr(*, "transformed")= logi FALSE 
- attr(*, "base")= num 1 

답변

1

@Smiley 숨은 공식으로 캐스팅 한 후 문자를 전달하는 대신 시도 할 수 있습니다,하지만 당신이 내에서 as.formula()를 호출 할 필요가 나타납니다 DirichletReg() 기능. 말 그대로 대상 "공식"이름을 지정할 때

> f <- as.formula('Y~depth') 
> mod <- DirichReg(f, df) 
Error: object of type 'symbol' is not subsettable 

> f <- 'Y~depth' 
> mod <- DirichReg(as.formula(f), df) 

흥미롭게도,이 (아마도 여러 가지 이유가) 작동하지 않습니다 : 위의 예제 데이터에서 나는 가정

> formula <- 'Y~depth' 
> mod <- DirichReg(as.formula(formula), df) 
Error: object of type 'closure' is not subsettable 

직접 어떤 종류의있다 formula이라는 오브젝트에 대한 참조는 DirichletReg() 함수 내에 있으므로, 특히이를 부르지 마십시오.

1

나중에이 암시되어 있습니다 as.formula

as.formula("z ~ x + y") 
+0

조언을 주셔서 감사합니다.하지만 불행히도 as.formula와 reformulate와 같은 결과가 있습니다. - 편집을 참조하십시오. – jFrostad

0

또한 함수에서 @ dmp의 해결 방법을 사용하려는 경우 수식 객체를 전역 환경에 할당해야합니다.

참조 문제 :

library (DirichletReg) 

df <- ArcticLake # plug-in your data here 
df$Y <- DR_data(df[,1:3]) # prepare the Y's 

f <- reformulate(termlabels = "depth", response="Y") 

mod <- DirichReg(f %>% as.formula, df) 

runReg <- function(this.formula, data) { 

    message(this.formula) 

    mod <- DirichReg(as.formula(this.formula), data) 

    return(mod) 

} 

res <- runReg("Y~depth", df) 

Y ~ 깊이 as.formula에서 오류 (this.formula) : 객체는 'this.formula'

그리고 해결책을 찾을 수 없습니다

runReg <- function(this.formula, data) { 

    message(this.formula) 

    f <<- this.formula 


    mod <- DirichReg(as.formula(f), data) 

    return(mod) 

} 

res <- runReg("Y~depth", df) 

이것은 꽤 많은 해킹 방법이 될 것 같습니다. 신중한 네임 스페이스 충돌 때문에 다른 사람이 다른 솔루션에 대한 아이디어를 가지고 있는지 확인하는 데 관심이 있습니다.