вектор имен переменных в R - PullRequest
       6

вектор имен переменных в R

7 голосов
/ 27 августа 2010

Я бы хотел создать функцию, которая автоматически генерирует одно- и многомерный регрессионный анализ, но я не могу понять, как я могу указать ** переменные в векторах ... ** Это кажется очень простым, но скиммингомдокументация, которую я до сих пор не понял ...

Простой пример

a<-rnorm(100)
b<-rnorm(100)
k<-c("a","b")
d<-c(a,b)
summary(k[1])

Но k [1] = "a" и является символьным вектором ... d это просто bдобавляется к, а не к именам переменных.По сути, я бы хотел, чтобы k [1] представлял вектор a.

Ценю любые ответы ...

// M

Ответы [ 3 ]

11 голосов
/ 27 августа 2010

Вы можете использовать функцию «get», чтобы получить объект на основе символьной строки его имени, но в долгосрочной перспективе лучше хранить переменные в списке и просто получать к ним доступ таким образом, все становится намного проще Вы можете получить подмножества, вы можете использовать lapply или sapply для запуска одного и того же кода на каждом элементе. При сохранении или удалении вы можете просто работать со всем списком, а не пытаться запомнить каждый элемент. e.g.:

mylist <- list(a=rnorm(100), b=rnorm(100) )
names(mylist)
summary(mylist[[1]])
# or
summary(mylist[['a']])
# or
summary(mylist$a)
# or 
d <- 'a'
summary(mylist[[d]])

# or
lapply( mylist, summary )

Если вы программно создаете модели для анализа с помощью lm (или других функций моделирования), то один из подходов состоит в том, чтобы просто установить подмножество ваших данных и использовать «.», Например ::

.
yvar <- 'Sepal.Width'
xvars <- c('Petal.Width','Sepal.Length')
fit <- lm( Sepal.Width ~ ., data=iris[, c(yvar,xvars)] )

Или вы можете построить формулу, используя "paste" или "sprintf", а затем использовать "as.formula", чтобы преобразовать ее в формулу, например ::

yvar <- 'Sepal.Width'
xvars <- c('Petal.Width','Sepal.Length')
my.formula <- paste( yvar, '~', paste( xvars, collapse=' + ' ) )
my.formula <- as.formula(my.formula)
fit <- lm( my.formula, data=iris )

Обратите внимание также на проблему множественных сравнений, если вы смотрите на различные модели, подходящие автоматически.

3 голосов
/ 27 августа 2010

вы можете использовать список k=list(a,b). Это создает список с компонентами a и b, но не является списком имен переменных.

2 голосов
/ 27 августа 2010

get () - это то, что вы ищете:

summary(get(k[1]))

edit: get () - это не то, что вы ищете, это список ().get () также может быть полезен.

Если вы ищете автоматическую генерацию регрессионного анализа, вы можете получить пользу от использования eval (), хотя каждый R-программист предупредит вас об использовании eval ()если вы не очень хорошо знаете, что делаете.Пожалуйста, внимательно прочитайте файлы справки о eval () и parse () перед их использованием.

Пример:

d <- data.frame(
  var1 = rnorm(1000),
  var2 = rpois(1000,4),
  var3 = sample(letters[1:3],1000,replace=T)
)

vars <- names(d)

auto.lm <- function(d,dep,indep){
      expr <- paste(
          "out <- lm(",
          dep,
          "~",
          paste(indep,collapse="*"),
          ",data=d)"
      )
      eval(parse(text=expr))
      return(out)
}

auto.lm(d,vars[1],vars[2:3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...