【问题标题】:Trimming reaction time data per participant per condition根据条件修剪每位参与者的反应时间数据
【发布时间】:2016-07-28 11:27:38
【问题描述】:

我有反应时间数据,我正试图去除异常值。我的目标是计算每个条件下每个参与者的标准偏差,并删除高于平均值 2 个 SD 的值。 我的 data.frame data_vfin 看起来像这样。每个参与者有四个条件和每个条件六个观察结果。

participant condition   rt
1435157254  I_A        728
1435157254  A_A        752
1435157254  A_S        2771
1435157254  I_S        673
1435157254  I_A        1749
1435157254  A_A        1215
1435157254  A_S        681
1435157254  I_S        488
1435157254  I_A        464
1435157254  A_A        525
1435157254  A_S        517
1435157254  I_S        426
1435157254  I_A        431
1435157254  A_A        453
1435157254  A_S        522
1435157254  I_S        421
1435157254  I_A        432
1435157254  A_A        493
1435157254  A_S        377
1435157254  I_S        425
1435157254  I_A        356
1435157254  A_A        486
1435157254  A_S        369
1435157254  I_S        381
1435157283  A_A        3088
1435157283  I_S        568
1435157283  A_S        488
1435157283  I_A        432
1435157283  A_A        536
1435157283  I_S        456
1435157283  A_S        440
1435157283  I_A        456
1435157283  A_A        1192
1435157283  I_S        344
1435157283  A_S        432
1435157283  I_A        456
1435157283  A_A        449
1435157283  I_S        440
1435157283  A_S        592
1435157283  I_A        448
1435157283  A_A        1136
1435157283  I_S        448
1435157283  A_S        384
1435157283  I_A        472
1435157283  A_A        432
1435157283  I_S        624
1435157283  A_S        464

我已经能够使用以下代码按参与者或条件进行修剪:

data_trimmed <- do.call(rbind,by(data_vfin,data_vfin$participant, function(x) x[!abs(scale(x$rt)) > 2,] ))

但是,我不知道如何同时针对每个参与者的每个条件执行此操作。我对使用 R 很陌生,所以任何帮助都会非常受欢迎。

P.S.:我尝试使用为这个精确操作制作的 trimr 包,但是当我尝试修剪每个参与者的每个条件并选择“原始”作为返回类型时,它返回一个空的 data.frame。

【问题讨论】:

  • 使用您提供的数据按参与者和条件进行分组会导致每个组的 rt 列只有 1 个值。当取一行的标准差时,你总是会得到NA。如果数据恰好超过您在此处显示的数据,请在此处添加更多行。
  • 每个参与者的每个条件有六个观察值。我已经编辑了我的帖子以反映这一点。

标签: r


【解决方案1】:

使用dplyrmagrittr 包:

install.packages(pkgs=c('dplyr','magrittr'))
library(dplyr)
library(magrittr)

rt <- structure(list(participant = c(1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157254L, 1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157254L, 1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157254L, 1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157254L, 1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157283L, 1435157283L, 1435157283L, 1435157283L, 
1435157283L, 1435157283L, 1435157283L, 1435157283L, 1435157283L, 
1435157283L, 1435157283L, 1435157283L, 1435157283L, 1435157283L, 
1435157283L, 1435157283L, 1435157283L, 1435157283L, 1435157283L, 
1435157283L, 1435157283L, 1435157283L, 1435157283L), condition = structure(c(3L, 
1L, 2L, 4L, 3L, 1L, 2L, 4L, 3L, 1L, 2L, 4L, 3L, 1L, 2L, 4L, 3L, 
1L, 2L, 4L, 3L, 1L, 2L, 4L, 1L, 4L, 2L, 3L, 1L, 4L, 2L, 3L, 1L, 
4L, 2L, 3L, 1L, 4L, 2L, 3L, 1L, 4L, 2L, 3L, 1L, 4L, 2L), .Label = c("A_A", 
"A_S", "I_A", "I_S"), class = "factor"), rt = c(728L, 752L, 2771L, 
673L, 1749L, 1215L, 681L, 488L, 464L, 525L, 517L, 426L, 431L, 
453L, 522L, 421L, 432L, 493L, 377L, 425L, 356L, 486L, 369L, 381L, 
3088L, 568L, 488L, 432L, 536L, 456L, 440L, 456L, 1192L, 344L, 
432L, 456L, 449L, 440L, 592L, 448L, 1136L, 448L, 384L, 472L, 
432L, 624L, 464L)), .Names = c("participant", "condition", "rt"
), class = "data.frame", row.names = c(NA, -47L))

trimmed <- rt %>% group_by(participant, condition) %>% 
           mutate(avg = mean(rt), stdev = sd(rt)) %>% 
           filter(rt <= 2*stdev+avg) %>% 
           select(participant, condition, rt) %>% 
           as.data.frame()

只删除了一行。 rt 有 47 行,trimmed 有 46 行

这是怎么回事?

您首先按参与者和条件进行分组,对于每个组,您通过mutating data.frame 获得其标准差 (stdev) 和平均值 (avg)。使用这些平均值和标准差值,您可以过滤(即保留)rt 列的任何值,其中rt &lt;= 2*stdev + avg。最后,选择您的原始列。完成后,您可以将输出转换为原生 R data.frame。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多