3

在方差分析项中使用变量时,我遇到了一个问题。通常我会在术语中直接使用“AGE”,但是在循环中运行它,这样 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是的

有任何代码吗?

4

2 回答 2

4

您需要创建模型公式的字符串表示形式,然后使用as.formula.

myvar <- "AGE"
f <- as.formula(paste("dat ~", myvar))
aov(f)
于 2011-07-07T13:18:56.503 回答
1

正如 Richie 所写,粘贴似乎是最简单的解决方案。这是一个更完整的示例:

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')",您有严重的安全风险...

于 2011-07-07T15:08:11.603 回答