【问题标题】:How to calculate a mean baseline value per trial per participant in a data frame如何计算数据框中每个参与者每次试验的平均基线值
【发布时间】:2014-12-18 09:24:21
【问题描述】:

我有 24 位参与者的瞳孔测量数据,每个参与者都有数千行瞳孔大小测量值(我已将其命名为 PupilAvg)。时间列称为TrialTimestamp,以毫秒为单位。我也有trial.numbertrial.type 作为列。我的数据框的头部(mydata1)可以在下面看到。

RecordingName trial.number trial.type TrialTimestamp PupilAvg
1    Mix_20_S04            1       same              0    3.910
2    Mix_20_S04            1       same             17    3.815
3    Mix_20_S04            1       same            133    3.545
4    Mix_20_S04            1       same            150    3.460
5    Mix_20_S04            1       same            167    3.410
6    Mix_20_S04            1       same            183    3.345

我的问题是:我如何才能获得每个参与者每次试验的平均基线,其中基线等于时间 5400 毫秒和 5500 毫秒之间的平均瞳孔大小?我希望能够从我的分析窗口内的瞳孔测量值中减去这些基线测量值(以针对个体差异进行校正)。

我已经为一名参与者 (04) 的一项试验(试验 3)提供了一个代码。

S04data<-filter(mydata1, RecordingName == "Mix_20_S04")
S04data1<-filter(S04data, trial.number == "3")
baselineS04 <- with(S04data1, mean(PupilAvg[TrialTimestamp >= 5400 & TrialTimestamp <= 5500]))

这将返回值 3.1225。所以参与者 4,试验 3 的基线值为 3.1225。

如果有人可以帮助我编写代码以在每次试验中为每个参与者获取基线测量值,我将非常感激(而我不必为每次试验的每个参与者编写我的个人代码!!)。

【问题讨论】:

    标签: r mean baseline


    【解决方案1】:

    我认为您可以将 aggregate 与数据子集一起使用,以仅包含您的 TrialTimestamp 范围内的观察结果。我在这里使用 130 和 150(所以我可以使用发布的数据),但您可以将它们更改为 5400 和 5500ms。

    # your data
    mydata1 <- read.table(text="RecordingName trial.number trial.type TrialTimestamp PupilAvg
    1    Mix_20_S04            1       same              0    3.910
    2    Mix_20_S04            1       same             17    3.815
    3    Mix_20_S04            1       same            133    3.545
    4    Mix_20_S04            1       same            150    3.460
    5    Mix_20_S04            1       same            167    3.410
    6    Mix_20_S04            1       same            183    3.345", header=TRUE)
    
    
    # Find mean: subset the data so that only values within 
    # required TrialTimestamp range
    aggregate(PupilAvg ~ RecordingName + trial.number ,
         data=mydata1[(mydata1$TrialTimestamp > 130 & mydata1$TrialTimestamp < 155),], 
                                                                   mean)
    

    编辑

    正如 Michael 在 cmets 中提到的那样,aggregate 有一个 subset 参数,因此您可能会觉得这更容易

    aggregate(PupilAvg ~ RecordingName + trial.number, data=mydata1, mean, 
                             subset = TrialTimestamp > 130 & TrialTimestamp < 155)
    

    【讨论】:

    • 可以利用subset 上的aggregate 参数:aggregate(PupilAvg ~ RecordingName + trial.number, data=mydata1, mean, subset = TrialTimestamp &gt; 130 &amp; TrialTimestamp &lt; 155)
    • @MichaelLawrence;谢谢迈克尔 - 你知道我之前从未注意到子集参数
    【解决方案2】:

    看看你是否喜欢试试 data.table 选项:

    library(data.table)
    setDT(mydata1) # set data frame to data table
    mydata1[TrialTimestamp > 130 & TrialTimestamp < 155,  ## i arg  - subset
                 list(PupilAvg = mean(PupilAvg)),         ## j arg  - aggregate
           by = c("RecordingName", "trial.number")]       ## by arg - group by
    #    RecordingName trial.number      PupilAvg
    # 1:    Mix_20_S04            1        3.5025
    

    还可以在 data.table 包中签出 ?between

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 2015-08-02
      • 2020-04-10
      • 2021-12-12
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多