在R中模拟相关React时间和准确度

6kkfgxo0  于 2023-09-27  发布在  React
关注(0)|答案(2)|浏览(112)

我想模拟的React时间和准确性与一定的相互关系。
这是我的第一个猜测:

n <- 2000

RTs <- brms::rshifted_lnorm(n, meanlog = log(1.3), sdlog = 0.1, shift = 0.5)

acc <- sapply(RTs,
              FUN = function(x){
                rbinom(
                  n = 1,
                  # multiplying by 0.3 should give me a correlation around 0.3... am I right?
                  prob = boot::inv.logit(x * 0.3), 
                  size = 1
                  )
                }
              )

cor(RTs, acc)

然而,所得到的相关性在0左右而不是0.3左右。
我做错了什么?
我看到了这个答案:Simulation of correlated categorical and continuous data,但它模拟分类(可以转换为二项数据)和高斯分布。

fnvucqvd

fnvucqvd1#

这里是一个简单的解决方案,通过保持相关性的模拟。我们需要做的就是以受控的方式生成二进制变量(acc)(给定生成的RT值)。
由于所生成的变量值需要保持固定的相关性,因此它们两者都不能作为来自对应分布的独立样本来提取。
如果一个变量中越来越多的高值对应于另一个变量的高值,并且类似地对应于低值,则两个随机向量之间的相关性可以增加。
下面的函数gen.correlated.binary.data()从要生成的目标向量acc中的低数量的1开始,并逐渐增加对应于变量RT的高值的1的数量(通过排序来确保)。
这使RT向量保持不变,但逐渐增加变量之间的相关性。现在,一旦达到所需的相关值,就立即停止-这将创建acc向量中所需的对排序和1的比例。
最后,通过保持对应性(从而保持相关常数)来混洗向量,以生成随机acc向量。

gen.correlated.binary.data <- function(x, r) {
  n <- length(x)
  xs <- sort(x)
  ys <- c(rep(0, n-1), 1)
  rc <- cor(xs, ys)
  i <- n
  while ((rc < r) & (i > 1)) { # match sorted x with sorted y
    ys[i] <- 1
    i <- i - 1
    rc <- cor(xs, ys)
  }
  ix <- sample(1:n, n, replace=FALSE) 
  x <- xs[ix] # shuffle
  y <- ys[ix] # shuffle
  
  return(list(x=x, y=y))
}

现在,从生成的RT向量开始,生成acc向量:

set.seed(1)
n <- 2000
RTs <- brms::rshifted_lnorm(n, meanlog = log(1.3), sdlog = 0.1, shift = 0.5)
res <- gen.correlated.binary.data(RTs, 0.3)
RTs <- res$x
acc <- res$y

RTs
# [1] 1.804578 2.025394 1.750515 1.611236 1.791022 1.910226 1.714558 1.667378 1.658610
# ...
acc
# [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
# ...

cor(RTs, acc)  
# [1] 0.3035055

下图显示了生成的变量值的分布沿着相关性和stat_smooth拟合线。
x1c 0d1x下一个动画显示了如何修改acc向量以实现相关性(0.5这次是通过逐渐增加相关性),给定RT向量:

注意,RT矢量以及RT的分布是固定的,只有acc分布发生变化,因此相关性增加。

5fjcxozz

5fjcxozz2#

谢谢你的评论和精彩的回答。
然而,我尝试了一种不同的方法,包括模拟多元高斯,然后将其转换如下:

m <- 2
n <- 2000

sigma1 <- matrix(c(1, 0.4,
              0.4, 1), 
            nrow=2)

z1 <- mvrnorm(n,mu=rep(0, m),
         Sigma=sigma1,
         empirical=FALSE)

RT_acc1 <-
  cbind(
    0.3 + exp(z1[,1]),
    ifelse( boot::inv.logit(z1[,2]) > 0.5, 1, 0)
  )

qgraph::cor_auto(RT_acc1)

这样,相关性在0.4左右

相关问题