R:对一个'的不同子集应用方差分析的函数;收集数据集并收集输出

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

一项常见的任务是必须对数据集的不同子集进行某种统计分析(如anova、glm或混合模型),并将输出表与汇总系数和p值组合在一个数据帧中。我正在寻找一个通用函数,它将采用模型类型(例如
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
    ..       ...          ...      ...   ...       ...          ...