2013-05-16 11 views
6

Rでは、数式オブジェクトはシンボリックであり、解析するのが難しいようです。しかし、私は、例えば、fまかせ Rを使用して外部使用の記号式を解釈する

(1)

R.外の使用のための標識の明示的なセットに、このような式を解析する必要がある応答が指定されていないmodel formulaeを表します~V1 + V2 + V3、私が試した一つのことでした:

t <- terms(f) 
attr(t, "term.labels") 

fの変数のいくつかは、カテゴリいる場合しかし、これはまさに、明示的であるものを取得していません。たとえば、V1を2つのカテゴリ(ブール値)を持つカテゴリ変数とし、V2を2倍にするとします。

したがって、~V1:V2で指定されたモデルには、2つのパラメータ、「intercept」と「xyes:z」が必要です。一方、~V1:V2 - 1で指定されたモデルは、パラメータ "xno:z"と "xyes:z"を持つ必要があります。しかし、どの変数がカテゴリ(およびいくつのカテゴリ)であるのかをファンクションを知らせる方法なしでは、これらを解釈する方法がありません。代わりに、がカテゴリに属する​​という意味で何も意味しない、「terms.labels」にはV1:V2があります。 model.matrixを使用して一方

(2)

は、まさに私が欲しいものを得るための簡単な方法です。問題は、 data引数が必要だということです。私は、Rの外部で使用するために記号式を明示的に解釈したいので、私にとっては悪いです。この取得方法は、Rが読む必要があるため(比較的)外部ソースからのデータは、どの変数がカテゴリ(およびいくつのカテゴリ)であり、どの変数が2倍であるかということが、実際に式を知る必要があるときです。

実際のデータではなく、データの種類のみを指定して 'model.matrix'を使用する方法はありますか?そうでない場合、他に実行可能な解決策は何ですか?

答えて

4

これは、特定の変数が因子か数値かを判断できるデータがある場合のみです。だからあなたはデータ引数なしでそれをすることはできません。しかし、必要なのは、データそのものではなく、構造体なので、すべてのタイプの列で0行のデータフレームを使用することができます。

2 data.framesを見てみると
f <- ~ V1:V2 
V1numeric <- data.frame(V1=numeric(0), V2=numeric(0)) 
V1factor <- data.frame(V1=factor(c(), levels=c("no","yes")), V2=numeric(0)) 

:あなたは本当のデータセットを持っている場合、0行を取得することは容易であるこれらの

> model.matrix(f, data=V1numeric) 
    (Intercept) V1:V2 
attr(,"assign") 
[1] 0 1 
> model.matrix(f, data=V1factor) 
    (Intercept) V1no:V2 V1yes:V2 
attr(,"assign") 
[1] 0 1 1 
attr(,"contrasts") 
attr(,"contrasts")$V1 
[1] "contr.treatment" 

> V1numeric 
[1] V1 V2 
<0 rows> (or 0-length row.names) 
> str(V1numeric) 
'data.frame': 0 obs. of 2 variables: 
$ V1: num 
$ V2: num 
> V1factor 
[1] V1 V2 
<0 rows> (or 0-length row.names) 
> str(V1factor) 
'data.frame': 0 obs. of 2 variables: 
$ V1: Factor w/ 2 levels "no","yes": 
$ V2: num 

使用model.matrix data.frameから列情報を保持しています。 FALSEを添えてください。適切なプロパティを持っている場合は、data.frameを手作業で構築する必要はありません。

> str(mtcars) 
'data.frame': 32 obs. of 11 variables: 
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ... 
$ disp: num 160 160 108 258 360 ... 
$ hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec: num 16.5 17 18.6 19.4 17 ... 
$ vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb: num 4 4 1 1 2 1 4 2 2 4 ... 
> str(mtcars[FALSE,]) 
'data.frame': 0 obs. of 11 variables: 
$ mpg : num 
$ cyl : num 
$ disp: num 
$ hp : num 
$ drat: num 
$ wt : num 
$ qsec: num 
$ vs : num 
$ am : num 
$ gear: num 
$ carb: num 
+0

お返事ありがとうございます。私は実際のデータセットを持っていますが、それを読むことは効率を低下させるので、それは大きくて外部Rです。あなたが最初の部分で持っていたものは素晴らしかったが、私が理解していないことの1つは、 'model.matrix(f、data = V1Factor)'は関連する3つのパラメータを生成し、インターセプトです。 –

+0

Rは、インタラクションが存在するときに低次のパラメータを削除することを嫌っていることが知られています。おそらくその理由は次のとおりです。http://stackoverflow.com/q/11335923/289572 – Henrik

+0

@JonClaus私は、 「V1」が「いいえ」のときの「V2」の傾き、「V1」が「はい」のときの「V2」の傾き(ここでパラメータ化される方法)を含む。切片で3つのパラメータ、「V1」が「いいえ」のときの「V2」の傾き、「V1」が「いいえ」から「はい」に変化するときの「V2」の傾きの変化を得ることもできる。あなたはそれをパラメータ化しますが、3つのパラメータがあります。 –

関連する問題