2013-05-16 2 views
6

В R объект формулы является символическим, и его довольно сложно разобрать. Тем не менее, мне нужно, чтобы разобрать такую ​​формулу в явном набор меток для использования вне R.Использование R для интерпретации символической формулы для внешнего использования

(1)

f Позволить представляют model formulae, в котором ответ не указан, например, ~V1 + V2 + V3, одна вещь, которую я попытался было:

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

Однако, это не получить то, что именно явное, если некоторые из переменных в f категоричны. Например, пусть V1 - это категориальная переменная с двумя категориями, то есть логическая, и пусть V2 будет двойной.

Следовательно, модель, заданная ~V1:V2, должна иметь 2 параметра: «перехват» и «xyes: z». Между тем, модель, заданная ~V1:V2 - 1, должна иметь параметры «xno: z» и «xyes: z». Однако, без способа сообщить функции terms(), какие переменные являются категориальными (и сколько категорий), не имеет возможности их интерпретировать. Вместо этого он просто имеет V1:V2 в своих «terms.labels», что ничего не значит в контексте, что V1 категоричен.

(2)

С другой стороны, используя model.matrix простой способ, чтобы получить именно то, что я хочу. Проблема в том, что для этого требуется аргумент data, что плохо для меня, потому что я хочу только ясную интерпретацию символической формулы для использования вне R. Этот метод получения этого будет тратить много времени (сравнительно), потому что R должен читать данные из внешнего источника, когда все, что ему действительно нужно знать для формулы, - это переменные, которые являются категориальными (и сколько категорий) и какие переменные удваиваются.

Можно ли использовать «model.matrix» только с указанием типов данных, а не фактических данных? Если нет, то что еще является жизнеспособным решением?

ответ

4

Ну, только в контексте наличия данных можно определить, является ли данная переменная фактором или числовым. Таким образом, вы не можете сделать это без аргумента данных. Но все, что вам нужно, это структура, а не сами данные, поэтому вы можете использовать фрейм данных из 0 строк со столбцами всех правильных типов.

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

Глядя на двух data.frames:

> 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 с этими

> 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" 

Если у вас есть реальный набор данных, легко получить 0-строку 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, поэтому чтение - это то, что снижает эффективность. То, что у вас есть в первой части, выглядит великолепно, но я не понимаю, что 'model.matrix (f, data = V1Factor)' создает 3 соответствующих параметра, когда у него не должно быть 'V1no: V2', как там является перехватом. –

+0

R, как известно, неохотно удаляет параметры нижнего порядка, когда присутствуют взаимодействия, возможно, это причина: http://stackoverflow.com/q/11335923/289572 – Henrik

+0

@JonClaus Я думаю, что он должен иметь три параметра: перехват, наклон 'V2', когда' V1' нет, и наклон 'V2', когда' V1' - да (способ здесь параметризуется). Вы также можете получить 3 параметра с перехватом, наклон 'V2', когда' V1' нет, и изменение наклона 'V2', когда' V1' изменяется от нет до да. Однако вы его параметризируете, есть 3 параметра. –

Смежные вопросы