一个常见的任务是必须在数据集的不同子集上执行某种统计分析(如anova,glm或混合模型),并将输出表与汇总系数和p值组合在一个数据帧中 . 我正在寻找一个通用函数,它将采用模型类型(例如 aov(...)
或 lm(...)
或 glm(...)
或 glmer(...)
)以及根据每个重复分析必须为其返回系数和p值的特定输出项 . 一个数据集中的一些分组变量 .
假如我有一个数据帧,我想在数据帧 data
中对因子"replicate"的不同级别进行某种分析:
data(iris)
library(car)
data=data.frame()
for (i in 1:10) {data=rbind(data,cbind(replicate=i,iris))}
使用 broom+dplyr
,我可以例如对此数据帧的每个子集执行anova(按复制分组)并使用term "Species"保持p值
library(devtools)
install_github("dgrtwo/broom")
library(broom)
library(dplyr)
group_by(data, replicate) %>% do(tidy(Anova(aov(Sepal.Length ~ Species, data = .),type="III"))) %>% filter(term=="Species")
Source: local data frame [10 x 6]
Groups: replicate [10]
replicate term sumsq df statistic p.value
(int) (chr) (dbl) (dbl) (dbl) (dbl)
1 1 Species 189.6364 2 362.6614 2.580311e-94
2 2 Species 189.6364 2 362.6614 2.580311e-94
3 3 Species 189.6364 2 362.6614 2.580311e-94
4 4 Species 189.6364 2 362.6614 2.580311e-94
5 5 Species 189.6364 2 362.6614 2.580311e-94
6 6 Species 189.6364 2 362.6614 2.580311e-94
7 7 Species 189.6364 2 362.6614 2.580311e-94
8 8 Species 189.6364 2 362.6614 2.580311e-94
9 9 Species 189.6364 2 362.6614 2.580311e-94
10 10 Species 189.6364 2 362.6614 2.580311e-94
(我在这里只使用了10个相同的数据子集)
我正在寻找一个更通用的函数“ Anovabygroup
”,它将采用数据帧,分组变量(此处为 replicate
,但它也可能是几个分组变量的组合),即要运行的模型类型(例如在这种情况下 'aov(Sepal.Length ~ Species, data = .)'
,但它也可能是lm,glm,lme,lmer或glmer模型或由 Anova()
处理的任何其他模型以及返回系数和p值的因子(可能选项"all"以返回所有内容)作为参数(给出的任何其他选项都可以传递给Anova的电话) . 有没有人知道如何使用类似于上面使用的代码的任何机会这样做,但一般化采取这些参数?主要的是我没有't know how to do is to pass on the model (e.g. in this case `' aov(Sepal.Length~Species,data = . )')作为参数并进行评估 . 或者它可能已经存在于某个包中?我认为这可能很有用,因为我总是发现自己一遍又一遍地编写这个任务......
PS我使用扫描包的github版本,因为当前的CRAN版本似乎不能很好地处理Anova输出
1 回答
答案:
您可以通过创建解析文本输入的包装函数来解决此问题 . 在这里,我使用
parse
和eval
.理想情况下,该函数还会检查传递的表达式(
glm
,lm
等)的有效性,但这里有一个示例函数可以帮助您入门 .它还允许您按照要求将其他选项传递给
Anova
:示例:
使用您的示例代码(感谢您发布好的代码!):
并使用
lm
而不是aov
和Anova
的不同参数:我经常在monte carlo模拟中反复使用这些类型的回归/ anovas,但我通常会为每种分析创建一个单独的函数 . R社区可能会对重复进行这些分析的软件包感兴趣!