Anova in R: выбор кадра данных - PullRequest
3 голосов
/ 07 июля 2011

Я просто столкнулся с проблемой при использовании переменной в термине anova.Обычно я использую слово «ВОЗРАСТ» непосредственно в термине, но запускаю все это в цикле, поэтому myvar изменится.

myvar=as.name("AGE")
x=summary( aov (dat ~  contrasts*myvar)+ Error(ID/(contrasts)), data =set))
names(set) = "contrasts" "AGE" "ID" "dat"

Это как когда я хочу выбрать:

 set$myvar 
  • не работает!но set$AGE да

Есть ли код для этого?

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

Вам необходимо создать строковое представление формулы модели, а затем преобразовать ее, используя as.formula.

myvar <- "AGE"
f <- as.formula(paste("dat ~", myvar))
aov(f)
1 голос
/ 07 июля 2011

Как писал Ричи, вставка кажется самым простым решением. Вот более полный пример:

myvar <- "AGE"
f <- as.formula(paste("dat ~ contrasts *", myvar, "+ Error(ID/contrasts)"))
x <- summary( aov(f, data=set) )

... и вместо set$myvar вы бы написали

set[[myvar]]

Более сложный ответ заключается в том, что формула на самом деле является вызовом оператора "~". Вы можете изменить вызов напрямую, что будет несколько более эффективным внутри цикла:

> f <- dat ~ contrasts * PLACEHOLDER + Error(ID/contrasts) # outside loop
> f[[3]][[2]][[3]] <- as.name(myvar) # inside loop
> f # see what it looks like...
dat ~ contrasts * AGE + Error(ID/contrasts)

Магия [[3]] [[2]] [[3]] определяет часть формулы, которую вы хотите заменить. Формула на самом деле выглядит примерно так (дерево разбора):

`~`(dat, `+`(`*`(contrasts, PLACEHOLDER), Error(`/`(ID, contrasts))

Поиграйтесь с индексированием формулы, и вы поймете:

> f[[3]] 
contrasts * AGE + Error(ID/contrasts) 
> f[[3]][[2]] 
contrasts * AGE 

ОБНОВЛЕНИЕ: Каковы преимущества этого? Ну, это более надежно - особенно если вы не контролируете имена столбцов данных. Если myvar <- "AGE GROUP" текущий раствор пасты не работает. И если myvar <- "file.create('~/OWNED')", у вас есть серьезная угроза безопасности ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...