У меня есть сводные итоговые результаты (N, среднее, стандартное отклонение) для вопросов опроса для разных подгрупп (например, по курсу, возрастной группе, полу). Я хотел бы выделить те подгруппы, в которых существуют статистически значимые записи, чтобы затем можно было исследовать результаты дальше. В идеале все это должно работать в процессе подготовки данных для отчета в R Markdown с использованием tidyverse / dplyr.
Мои данные выглядят так:
> head(demo, 11)
# A tibble: 11 x 7
# Groups: qid, subgroup [3]
qid question subgroup name N mean sd
<int> <chr> <chr> <chr> <dbl> <dbl> <dbl>
1 1 noise NA total 214 3.65 1.03
2 1 noise course A 11 4 0.77
3 1 noise course B 47 3.55 1.16
4 1 noise course C 31 3.29 1.24
5 1 noise course D 40 3.8 0.85
6 1 noise course E 16 3.38 1.09
7 1 noise course F 11 3.55 1.13
8 1 noise course G 25 4.12 0.73
9 1 noise course H 25 3.68 0.85
10 1 noise gender f 120 3.65 1.07
11 1 noise gender m 93 3.67 0.98
Я хочу новый столбец, указывающий ИСТИНА, если есть статистически значимое различие внутри подгруппы для данного вопроса, и ЛОЖЬ, если в противном случае. Как sigdiff ниже:
qid question subgroup name N mean sd sigdiff
<int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <lgl>
2 1 noise course A 11 4 0.77 FALSE
3 1 noise course B 47 3.55 1.16 FALSE
4 1 noise course C 31 3.29 1.24 FALSE
5 1 noise course D 40 3.8 0.85 FALSE
6 1 noise course E 16 3.38 1.09 FALSE
7 1 noise course F 11 3.55 1.13 FALSE
8 1 noise course G 25 4.12 0.73 FALSE
9 1 noise course H 25 3.68 0.85 FALSE
Теперь, очень изящный способ подойти к этому, казалось, состоял в том, чтобы определить, есть ли существенная разница между любыми группами, адаптировав этот подход на основе пакета rpsychi .
Мне не удалось, однако адаптировать это для применения к моей сгруппированной таблице. Мой (неудачный) подход заключался в том, чтобы попытаться просто вызвать функцию, выполняющую ANOVA, с помощью dplyr newi sh group_map :
if(!require(rpsychi)){install.packages("rpsychi")}
library(rpsychi)
if(!require(tidyverse)){install.packages("tidyverse")}
library(tidyverse)
#' function establishing significant difference
#' between survey answers within subgroups
anovagrptest <- function(grpsum){
anovaresult <- ind.oneway.second(grpsum$mean, grpsum$sd, grpsum$N, sig.level = 0.05)
# compare critical F Value
fcrit <- qf(.95, anovaresult$anova.table$df[1], anovaresult$anova.table$df[2])
if(anovaresult$anova.table$F[1] > fcrit){return(TRUE)
}else{return(FALSE)}
}
#' pass the subset of the data for the group to the function which
#' "returns a list of results from calling .f on each group"
relquestions <- demo %>%
group_by(qid, subgroup) %>%
group_map(~ anovagrptest(.x))
Код прерывается из-за ошибки в delta.upper + dfb: нечисловой c аргумент для бинарного оператора ". Идеи очень ценятся.