0

这个问题与我在这里提出的前一个问题相似:从行中随机求和值并将它们分配给 R 中的 2 列

由于我在使用 R 时遇到困难,所以这个问题既是关于编程的,也是关于统计的。我对两者都很陌生。

我有一列中有 219 个主题的 data.frame。其余的列是 7,在每一行中,我都有一个数字,代表该特定受试者在暴露于两种实验条件时的响应时间差异。

这是数据的样子(我使用的是 head 函数,否则会太长):

    > head(RTsdiff)
      subject   block3diff   block4diff   block5diff   block6diff   block7diff
    1   40002  0.076961798  0.046067460 -0.027012048  0.017920261  0.002660317
    2   40004  0.037558511 -0.016535211 -0.044306743 -0.011541667  0.044422892
    3   40006 -0.017063123 -0.031156150 -0.084003876 -0.070227149 -0.113382784
    4   40008 -0.015204017 -0.009954545 -0.004082353  0.006327839  0.022335271
    5   40009  0.006055829 -0.045376437 -0.002725572  0.016443182  0.032848128
    6   40010 -0.003017857 -0.034398268 -0.034476491  0.014158824 -0.036592982
       block8diff    block9dif
    1  0.03652273  0.037306173
    2 -0.08032784 -0.150682051
    3 -0.09724864 -0.060338684
    4 -0.04783333  0.006539326 
    5 -0.01459465 -0.067916667
    6 -0.01868126 -0.034409584

我需要的是一个代码,它将对每个主题(即每一行)采样 3 个或 4 个值,将它们平均,并将它们添加到一个新向量(称为 half1)中。向量 half2 应该具有在第一次尝试中未采样的值的平均值。

因此,假设我想要创建的 data.frame 被称为“RTshalves”,我需要第一列是 RTsdiff 中的同一列主题,第二列必须在第一行中包含随机选择的值的平均值对应于第一个主题,并且第二列必须具有第一个主题在第一次采样中未选择的值的平均值。第 2 列和第 3 列的第二行应该具有相同的信息,但这次是针对主题 2(即我的 data.frame 中的主题 40004)等,直到达到 219 个主题。

假设第一个样本随机选择了对象 1 的 3 个值(block3diff、block5diff 和 block9diff),因此 block4diff、block6diff、block7diff 和 block8diff 的值将自动对应另一半。然后,我希望看到的(仅考虑 219 行中的第一行)是:

   Subject     Half1       Half2 
    40002   0.02908531   0.02579269

如果有人对此背后的统计数据感兴趣,我正在尝试进行拆分可靠性测试以检查测试的一致性。基本原理是,如果 RT 平均值的差异是效果的可靠估计量,那么一个参与者的一半块的差异应该与另一半块的差异相关。

非常感谢您的帮助。提前致谢。

4

1 回答 1

1

half1 很简单:编写你自己的函数来对每一行做你想做的事情(作为一个向量),然后apply它对行:

eachrow <- function(x) {
   mean(sample(x,2))
}
RTsdiff$half1 <- apply(eachrow,1,RTsdiff)

要获得 half2,您可能需要同时进行。 ddply这可能是最简单的(让 by 参数成为您获取每一行的主题变量)。像这样:

RTsdiff <- data.frame(subject=seq(6))
RTsdiff <- cbind( RTsdiff, matrix(runif(6*8),ncol=8) )

library(plyr)
eachrow <- function(x,n=3) {
  x <- as.numeric(x[,2:ncol(x)]) # eliminate the ID column to make things easier, make a vector
  s <- seq(length(x))
  ones <- sample(s,n) # get ids for half1
  twos <- !(s %in% ones) # get ids for half2
  data.frame( half1=mean(x[ones]), half2=mean(x[twos]) )
}
ddply( RTsdiff, .(subject), eachrow)

  subject     half1     half2
1       1 0.4700982 0.5350610
2       2 0.6173469 0.5351995
3       3 0.2245246 0.6807482
4       4 0.6330649 0.6316353
5       5 0.6388060 0.6629077
6       6 0.4652086 0.5073034

有很多更优雅的方法可以做到这一点。特别是,我使用ddply了它轻松输出 data.frames 的能力,以便我可以同时输出half1half2从函数输出,并在最后将它们很好地组合起来,但ddply需要 data.frames 作为输入,所以需要一些小技巧来获得它首先输出一个向量。提供转置的data.framesapply可能会更简单。

于 2012-06-11T13:00:58.617 回答