Я хотел бы создать функцию, которая автоматически генерирует одно- и многомерный регрессионный анализ, но я не могу понять, как я могу указать ** переменные в векторах ... ** Это кажется очень простым, но бегло просматривая документацию, я пока не понял ...
Простой пример
a<-rnorm(100)
b<-rnorm(100)
k<-c("a","b")
d<-c(a,b)
summary(k[1])
Но k [1] = "a" и является вектором символов ... d просто добавляется к a, а не к переменной имена. По сути, я бы хотел, чтобы k [1] представлял вектор a.
Оцените любые ответы ...
// M
Вы можете использовать функцию "get", чтобы получить объект на основе строки символов его имени, но в долгосрочной перспективе лучше хранить переменные в списке и просто получайте к ним доступ таким образом, все становится намного проще, вы можете захватывать подмножества, вы можете использовать lapply или sapply для запуска одного и того же кода для каждого элемента. При сохранении или удалении вы можете просто работать со всем списком, а не пытаться запомнить каждый элемент. например:
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 )
Обратите внимание также на проблему множественных сравнений, если вы смотрите на множество разных моделей, подходящих автоматически.
вы можете использовать список k=list(a,b)
. Это создает список с компонентами a и b, но не является списком имен переменных.
get() это то, что вы ищете:
summary(get(k[1]))
edit: get() - это не то, что вы ищете, это list(). 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])