2017-11-29 3 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のBccで式にキャストし、その後文字を渡す代わりに試すことができますが、あなたが内から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の回避策を関数で使用しようとすると、数式オブジェクトをグローバル環境に割り当てる必要があります。

参照問題:as.formulaで

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〜深さ エラー(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) 

これは非常にハック的な方法です奇妙な名前空間の競合があるので、他の誰かが他のソリューションのアイディアを持っているかどうかを調べることに興味があります。

関連する問題