10

formula私は(クラスまたはFormulaの)形式の多くの式を持っています。y ~ a*bここで、aおよびbは因子です。

このような数式を受け取り、インタラクションのすべての用語を「スペルアウト」した数式を返す関数を作成する必要があります。次に例を示します。

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統計を計算することです。問題は、3つとしてanova扱われることです。fac1*fac2通常は3つ以上の変数を表しますが、変数は(たとえば、上記のコードでfac1*fac2は8つの変数を表します)、その結果、anovaネストされたモデルの制限の数を過小評価し、私の自由度を過大評価します。)

4

5 に答える 5

10

formulaあなたのために働く既存のものがあるかもしれないためのヘルプを見てください。

たとえば、式y ~ (a + b + c + d)^2はすべての主効果とすべての双方向相互作用を提供し、式y ~ (a + b) * (c + d)は上に示した展開を提供します。項を減算することもできるためy ~ a*b*c - a:b:c、3 方向の相互作用は含まれません。

于 2012-07-21T20:48:04.517 に答える
4

まだ数式のすべてのトリックを習得していませんが、明示的な数式が必要な場合は、貼り付けと共に sapply を使用する傾向があります。

# 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)

最終的には次のようになります。

> f
[1] "x ~ a + b + c + d + a:c + a:d + b:c + b:d"
于 2012-07-21T21:03:39.673 に答える
0

私はちょうどこの解決策に出くわしました:

  fac1 <- factor(c('a', 'a', 'b', 'b'))
  fac2 <- factor(c('c', 'd', 'c', 'd'))
  update(formula(x ~ fac1*fac2),~.)
于 2019-03-13T04:46:38.693 に答える
-1

同様の問題が発生しましたが、少し簡単です。数式では、50 の変数があり、それらを頻繁に変更する必要がありました。私たちの解決策は、Rスクリプト内でそれらをループで外部ファイルに送信し、実際の式を作成してから、そのtxtファイルを単純に読み取って貼り付けることでした。私が覚えている限り、ネストされたループでより多くの式を作成し、ファイルを1行ずつ読み戻すことができました。全体として、R スクリプトと bash の両方を使用することは常に良いことです

于 2012-07-21T20:09:41.347 に答える