R:对一个'的不同子集应用方差分析的函数;收集数据集并收集输出
一项常见的任务是必须对数据集的不同子集进行某种统计分析(如anova、glm或混合模型),并将输出表与汇总系数和p值组合在一个数据帧中。我正在寻找一个通用函数,它将采用模型类型(例如R:对一个'的不同子集应用方差分析的函数;收集数据集并收集输出,r,dplyr,glm,anova,broom,R,Dplyr,Glm,Anova,Broom,一项常见的任务是必须对数据集的不同子集进行某种统计分析(如anova、glm或混合模型),并将输出表与汇总系数和p值组合在一个数据帧中。我正在寻找一个通用函数,它将采用模型类型(例如aov(…)或lm(…)或glm(…)或glmer(…))以及特定的输出项,对于这些输出项,必须根据数据集中的某个分组变量为每个复制分析返回系数和p值 假设我有一个数据帧,我想对数据帧中不同级别的因子“复制”进行某种分析数据: data(iris) library(car) data=data.frame() for
aov(…)
或lm(…)
或glm(…)
或glmer(…)
)以及特定的输出项,对于这些输出项,必须根据数据集中的某个分组变量为每个复制分析返回系数和p值
假设我有一个数据帧,我想对数据帧中不同级别的因子“复制”进行某种分析数据:
data(iris)
library(car)
data=data.frame()
for (i in 1:10) {data=rbind(data,cbind(replicate=i,iris))}
使用broom+dplyr
,例如,我可以对该数据帧的每个子集进行方差分析(通过复制分组),并使用
(我在这里使用了10个相同的数据子集作为示例)
我正在寻找一个更通用的函数“Anovabygroup
”,它将采用数据帧、分组变量(此处为replicate
,但也可能是几个分组变量的组合)、要运行的模型类型(例如,在本例中为'aov(Sepal.Length~Species,data=)“
,但它也可以是lm、glm、lme、lmer或glmer模型,或由Anova()处理的任何其他模型,并将返回系数和p值的因子(可能使用选项“all”返回所有内容)作为参数(所给出的任何其他选项都可以传递给Anova调用)。任何人都知道如何使用与上面使用的代码类似的代码来实现这一点,但这些代码都是通用的,可以接受这些参数吗?我不知道怎么做的主要事情是将模型(例如,在本例中,“'aov(Sepal.Length~Species,data=)”)作为参数传递,并对其进行评估。或者它可能已经存在于某个包中?我认为这可能是有用的,因为我总是发现自己编码这个任务一遍又一遍
PS我使用了github版本的broom软件包,因为当前的CRAN版本似乎不能很好地处理方差分析输出答案:
您可以通过创建一个解析文本输入的包装器函数来解决这个问题。
在这里,我使用parse
和eval
理想情况下,该函数还将检查传递的表达式(glm
、lm
等)的有效性,但下面是一个示例函数
它还允许您根据要求将其他选项传递给Anova
:
anova_wrapper <- function(data, model_expression_as_string, grouping_variable,...) {
f_wrap <- paste0('function(.) {',model_expression_as_string,'}') %>% parse(text=.) %>% eval
data %>% group_by_(grouping_variable) %>%
do(f_wrap(.) %>% Anova(...=...) %>% tidy) %>% return
}
使用lm
代替aov
和不同的变量进行Anova
:
data %>%
anova_wrapper(model_expression_as_string = lm_model_expression_as_string,
grouping_variable = grouping_variable,type="III")
replicate term sumsq df statistic p.value
(int) (chr) (dbl) (dbl) (dbl) (dbl)
1 1 Sepal.Width 8.19627 1 73.78707 1.163254e-14
2 1 Petal.Length 84.42733 1 760.05861 5.847914e-60
3 1 Residuals 16.32876 147 NA NA
4 2 Sepal.Width 8.19627 1 73.78707 1.163254e-14
5 2 Petal.Length 84.42733 1 760.05861 5.847914e-60
6 2 Residuals 16.32876 147 NA NA
7 3 Sepal.Width 8.19627 1 73.78707 1.163254e-14
8 3 Petal.Length 84.42733 1 760.05861 5.847914e-60
9 3 Residuals 16.32876 147 NA NA
10 4 Sepal.Width 8.19627 1 73.78707 1.163254e-14
.. ... ... ... ... ... ...
我经常在蒙特卡罗模拟中重复这些类型的回归/方差分析,但我通常为每种分析创建一个单独的函数。R社区可能对重复进行这些分析的软件包感兴趣 你不是刚刚创建了这个函数吗?只要用一个变量替换公式就可以了,但我不知道如何把模型作为参数传递。假设我有一个参数model=“aov(Sepal.Length~Species,data=)”,如何传递它(因为它是文本,但必须进行评估)?很抱歉,如果我的问题是将其包装成一个适当的、更通用的函数,那么这很简单,但我对R是新手……仅仅传递公式是不够的,因为还需要说明您是否想要aov、lm、glm、glmer等。。。。要打的电话。。。所以我认为将整个调用作为文本参数传递可能是最简单的,但我不知道如何对其进行评估……啊,好的。有不同的方法可以做到这一点。例如,查看lm
代码以了解它如何处理公式参数。传递模型就足够了,因为Anova
是一种通用方法,它为处理的各种函数分配不同的方法。编辑:您不想传递文本-请使用quote
d表达式或公式参数。感谢您的建议-我们将对此进行调查!如果它很容易,你也可以考虑把它作为一个答案,尽管:
data=data.frame()
for (i in 1:10) {data=rbind(data,cbind(replicate=i,iris))}
aov_model_expression_as_string = 'aov(Sepal.Length ~ Species, data = .)'
lm_model_expression_as_string = 'lm(Sepal.Length ~ Sepal.Width + Petal.Length , data = .)'
grouping_variable = 'replicate'
data %>%
anova_wrapper(model_expression_as_string = aov_model_expression_as_string,
grouping_variable = grouping_variable,type="III")
Source: local data frame [30 x 6]
Groups: replicate [10]
replicate term sumsq df statistic p.value
(int) (chr) (dbl) (dbl) (dbl) (dbl)
1 1 (Intercept) 1253.00180 1 4728.1630 1.134286e-113
2 1 Species 63.21213 2 119.2645 1.669669e-31
3 1 Residuals 38.95620 147 NA NA
4 2 (Intercept) 1253.00180 1 4728.1630 1.134286e-113
5 2 Species 63.21213 2 119.2645 1.669669e-31
6 2 Residuals 38.95620 147 NA NA
7 3 (Intercept) 1253.00180 1 4728.1630 1.134286e-113
8 3 Species 63.21213 2 119.2645 1.669669e-31
9 3 Residuals 38.95620 147 NA NA
10 4 (Intercept) 1253.00180 1 4728.1630 1.134286e-113
.. ... ... ... ... ... ...
data %>%
anova_wrapper(model_expression_as_string = lm_model_expression_as_string,
grouping_variable = grouping_variable,type="III")
replicate term sumsq df statistic p.value
(int) (chr) (dbl) (dbl) (dbl) (dbl)
1 1 Sepal.Width 8.19627 1 73.78707 1.163254e-14
2 1 Petal.Length 84.42733 1 760.05861 5.847914e-60
3 1 Residuals 16.32876 147 NA NA
4 2 Sepal.Width 8.19627 1 73.78707 1.163254e-14
5 2 Petal.Length 84.42733 1 760.05861 5.847914e-60
6 2 Residuals 16.32876 147 NA NA
7 3 Sepal.Width 8.19627 1 73.78707 1.163254e-14
8 3 Petal.Length 84.42733 1 760.05861 5.847914e-60
9 3 Residuals 16.32876 147 NA NA
10 4 Sepal.Width 8.19627 1 73.78707 1.163254e-14
.. ... ... ... ... ... ...