2016-08-25 3 views
0

Я пытаюсь сделать небольшой пакет R с ограниченными знаниями в программировании R. Я пытаюсь использовать следующий аргумент:Как разбить «формулу» в R

formula=~a+b*X 

, где Х представляет собой вектор, «а» и «б» константы в вызове функции.

Что мне интересно, я когда-то вводил формулу, я хочу выделить (a,b) и X отдельно и использовать их для других манипуляций с данными внутри вызова функции. Есть ли способ сделать это в R?

Я бы очень признателен за любые рекомендации.

Примечание: Под редакцией мой вопрос для ясности

Я ищу что-то подобное model.matrix) выход (. Выше формула может быть более обобщенным для размещения 'п' число переменных, скажем,

~ 2 + 3 * Х + 4 * Y + ... + 2 * Z

В вывода, мне нужны коэффициенты (2 3 4 ... 2) как вектор и [1 XY ... Z] как ковариационная матрица.

+0

Это не очень ясно. Мне кажется, что X - это данные, которые вводит пользователь, в то время как a и b могут быть оценены. Если это так, X предоставляется пользователем, а a и be - это возвращаемые значения из некоторой функции оценки. Заметим, что в R формула = ... называется аргументом, а не опцией (Stata background?). Мой совет: играйте с извлечением коэффициентов из 'lm'' glm' и 'nls' в течение недели или около того. Затем перейдите к этому проекту. – lmo

+0

@Imo Извините, если это не понятно. Я хочу сказать, что передаю аргумент «formula» в моей функции, и пользователь может вводить a, b и X в качестве полинома. Я должен сказать, что a и b являются константами, а не параметрами в этом случае. – Vineetha

ответ

4

Вопрос не совсем ясен, поэтому мы будем предполагать, что вопрос задается формулой с использованием стандартного синтаксиса формулы, как мы анализируем имена переменных (или во втором ответе имена переменных и константы), выдавая в качестве вывода вектор символов, содержащий их.

1) all.vars Попробуйте это:

fo <- a + b * X # input 
all.vars(fo) 

дает:

[1] "a" "b" "X" 

2) strapplyc Кроме того, мы могли бы сделать это с манипуляций со строками. В этом случае он также анализирует константы.

library(gsubfn) 
fo <- ~ 25 + 35 * X # input 
strapplyc(gsub(" ", "", format(fo)), "-?[0-9.]+|[a-zA-Z0-9._]+", simplify = unlist) 

дает:

[1] "25" "35" "X" 

Примечание: Если все, что вы пытаетесь сделать, это оценить РИТ формулы как выражение R, то это просто:

X <- 1:3 
fo <- ~ 1 + 2 * X 
eval(fo[[2]]) 

, давая:

[1] 3 5 7 

Обновление: Исправлено и добавлено второе решение и примечание.

+0

Если 'a' и 'b' являются константами, a.vars не будет работать, поскольку он возвращает только X. Я ищу (a, b) и вектор X. – Vineetha

+0

@ user20650, Здесь формула является пользователем , a и b - постоянные значения, а X - ковариационный вектор. Ситуация аналогична функции lm() /predict.lm(), но у меня нет переменной ответа, и я не пытаюсь подгонять модель. Если я могу извлечь коэффициенты (или константы в этом случае), скажем (a, b) и вектор X, я могу передать их другой функции внутри текущего вызова функции. a + b * X можно обобщить на многолинейную форму. Надеюсь, теперь это станет более ясным. – Vineetha

+0

Спасибо. Второй метод, использующий функцию strapplyc(), интересен, но есть ли способ сделать это без вызова какой-либо другой библиотеки. Кроме того, как мне получить значения, хранящиеся в X? Я хочу включить больше переменных и извлечь каждый из них вместе с константами. Есть предположения? – Vineetha

4

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

f <- ~a+bX 
f[[1]] 
#`~` 
f[[2]] 
#a + bX 
f[[2]][[1]] 
#`+` 
f[[2]][[2]] 
#a 

Однако обратите внимание, что в формуле bX является один символ, вы, вероятно, имел в виду b * X вместо этого.

f <- ~a + b * X 

Тогда a и b обычно будут храниться в невычисленном списке.

vars <- call('list', f[[2]][[2]], f[[2]][[3]][[2]]) 
vars 
#list(a, b) 

и vars будет передан eval в какой-то момент.

+0

Спасибо за указание b * X. Как получить значения, хранящиеся в X? Могу ли я обобщить f, например: f <- 2+ 3.5 * X + Y + z ...? Любые комментарии? – Vineetha

+0

'X' находится в' f [[2]] [[3]] [[3]] '. Для обобщения вам нужно написать парсер, который находит и извлекает элементы из формулы, которые в зависимости от типа формулы могут быть сложными. –

+0

@ Ernest A: Формула может иметь «n» число переменных с коэффициентами, например: 2 + 3 * x + 4 * y + 0,1 * z. Имея ограниченные знания в области программирования R, его нелегко переварить то, что вы упомянули о синтаксическом анализаторе. Не могли бы вы привести несколько примеров для написания парсера. Благодаря! – Vineetha

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