【问题标题】:How to create a data frame of various test results?如何创建各种测试结果的数据框?
【发布时间】:2021-07-21 18:24:38
【问题描述】:

在我们的实验中,我们有一个包含以下列的数据框:

Participant Condition parametricVariables nonParametricVariables orderNumber
1 Condition 1 14.7 4 1
1 Condition 2 11.4 1 2
2 Condition 1 8.2 7 2
2 Condition 2 13.0 6 1
... ... ... ... ...

我们有多个参数和多个非参数变量,并且只有两个条件。 orderNumber 列表示给定参与者测试给定条件的顺序 - 因此参与者 1 先测试条件 1,然后测试条件 2,而参与者 2 以相反的顺序测试它们。

尽管我们尽了最大努力,但我们正在尝试查看是否存在基于条件顺序的非系统变化。到目前为止,我们一直在使用函数调用并从输出中读取结果,如下所示:

ParticipantOrder1 <- gameSummary %>% filter(orderNumber == 1)
Condition1Order1 <- ParticipantOrder1 %>% filter(Condition==condition1_label)
Condition2Order1 <- ParticipantOrder1 %>% filter(Condition==condition2_label)

ParticipantOrder2 <- gameSummary %>% filter(orderNumber == 2)
Condition1Order2 <- ParticipantOrder2 %>% filter(Condition==condition1_label)
Condition2Order2 <- ParticipantOrder2 %>% filter(Condition==condition2_label)

# Check parametric variables for normality
# ...

# Check for difference in the parametric variable across the two orders using Welch's t-test
t.test(ParticipantOrder1$parametric, ParticipantOrder2$parametric)
t.test(Condition1Order1$parametric, Condition1Order2$parametric)
t.test(Condition2Order1$parametric, Condition2Order2$parametric)

# Check for difference in the non-parametric variable across the two orders using Wilcoxon signed ranked test
wilcox.test(ParticipantOrder1$nonParametric, ParticipantOrder1$nonParametric, paired=TRUE,exact=FALSE)
wilcox.test(Condition1Order1$nonParametric, Condition1Order2$nonParametric, paired=TRUE,exact=FALSE)
wilcox.test(Condition2Order1$nonParametric, Condition2Order2$nonParametric, paired=TRUE,exact=FALSE)

如您所见,当一个方法有多个参数和非参数变量时,这种方法会变得相当笨拙。我想知道是否有更好的方法将所有这些测试结果收集到这样的表格中:

Variable Condition TestType statistic p-value
parametric1 Both Welch Two Sample t-test 0.10317 0.9185
parametric1 Condition 1 Welch Two Sample t-test 0.625 0.5462
parametric1 Condition 2 Welch Two Sample t-test -0.69369 0.503
nonParametric1 Both Wilcoxon signed rank test with continuity correction 18 0.6295
... ... ... ... ...

【问题讨论】:

    标签: r dataframe statistics inference


    【解决方案1】:

    对数据进行分组

    首先,我们应该将所有数据按groupingVariable 分组。

    analysisSummary <- gameSummary %>%
      select(parametric1, parametric2, nonparametric1, groupingVariable) %>%
      gather(key = variable, value = value, -groupingVariable) %>%
      group_by(variable, groupingVariable) %>%
      summarise(value=list(value)) %>%
      spread(groupingVariable, value) %>% 
      group_by(variable)
    

    如果您想了解此查询是如何构建的,我建议您查看this tutorial by Sebastian Sauer

    这将为我们提供带有groupingValues 的下表,它们是groupingVariable 的值:

    variable groupingValue1 groupingValue2
    parametric1 <dbl [X]> <dbl [Y]>
    parametric1 <dbl [X]> <dbl [Y]>
    nonparametric1 <dbl [X]> <dbl [Y]>

    parametric1parametric1nonparametric1 是您要在两组之间进行比较的变量。

    groupingVariable 是您划分总体的指标。例如,它可能是sex,在这种情况下groupingValues 可能是malefemale [1]。或者,通过问题中的示例,groupingVariable 可能是 orderNumbergroupingValues 将是 12。请注意,这些都有数值 - 这给我们带来了一个问题。

    数字groupingVariables

    R 将不将列的数值视为名称,而是将其视为表中列的顺序号。如果您想要可读的代码,可以将这些列重命名为 order1order2 使用

    analysisSummary <- analysisSummary %>% rename(order1 = 2, order2 = 3)
    

    假设groupingValue1groupingValue2 列在表格中分别位于第二和第三位。

    运行测试

    我们可以使用case_when 为不同的变量有条件地运行不同的测试。

    analysisSummary %>% mutate(
        # Save the name of the test for convenient reference later
        test = case_when(
            isVariableParametric(variable) ~ "Welch's t test", TRUE ~ "Wilcoxon test"
        ),
        # Run the t-test for parametric variables and Wilcoxon signed rank test for non-parametric ones, save the p-value
        p_value = case_when(
            isVariableParametric(variable) ~ t.test(unlist(groupingVariable1), unlist(groupingVariable2))$p.value,
                TRUE ~ wilcox.test(unlist(groupingVariable1), unlist(groupingVariable2), paired=FALSE, exact=FALSE)$p.value
        ),
        # Run the test again, but now save the effect size
        statistic = case_when(
            isVariableParametric(variable) ~ t.test(unlist(groupingVariable1), unlist(groupingVariable2))$statistic,
                TRUE ~ wilcox.test(unlist(groupingVariable1), unlist(groupingVariable2), paired=FALSE, exact=FALSE)$statistic
        ),
    )
    

    您还应该定义一个函数来决定变量是否为参数。就我而言,我对其进行了硬编码(但长期、可重用的解决方案是动态解决它):

    isVariableParametric <- function(variable) {
      variable %in% c('parametric1', 'parametric2')
    }
    

    这将为我们提供一个易于浏览结果的表格:

    variable groupingValue1 groupingValue2 test p-value statistic
    parametric1 <dbl [X]> <dbl [Y]> Welch's t test 0.19081 0.23504
    parametric1 <dbl [X]> <dbl [Y]> Welch's t test 0.16398 0.00014
    nonparametric1 <dbl [X]> <dbl [Y]> Wilcoxon test 0.78727 87.5000

    [1] 在这里为了简单起见坚持两组,因为测试多组之间的差异需要额外的统计检查(Bonferroni 校正)或不同的方法 (ANOVA)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多