【发布时间】:2017-12-14 16:19:09
【问题描述】:
我有以下数据框'df'。 每个参与者(这里是 10 个参与者)看到了几个刺激物(这里是 100 个),并做出了 关于它的判断(这里是一个随机数)。对于每一个刺激,我都知道真实的 答案(这里是一个随机数;每个刺激都有一个不同的数字,但总是 所有参与者的答案相同)
participant <- rep(1:10, each=100)
stimuli <- rep(1:100, 10)
judgment <- rnorm(1000)
df1 <- data.frame(participant, stimuli, judgment)
df2 <- data.frame(stimuli=1:100, criterion=rnorm(100))
df <- merge(df1, df2, by='stimuli') %>% arrange(participant, stimuli)
这是我想要做的:
1) 随机选择 n 个参与者(这里 n 介于 1 和 10 之间)。
2) 计算他们对每个刺激的判断的平均值
3) 计算该均值与真实答案之间的相关性
我想对所有 n 执行步骤 1-3(即我想随机选择 1 名参与者并执行步骤 1-3,然后我想随机选择 2 名参与者并执行步骤 1-3 .. . 10 名随机选择的参与者并执行步骤 1-3。 结果应该是一个包含 10 行和 2 个变量的数据框:N 和相关性。我只想使用 dplyr。
我的解决方案是基于 lapply。这里是:
participants_id = unique (df$participant)
MyFun = function(Data) {
HelpFun = function(x, Data) {
# x is the index for the number of participants.
# It Will be used in the lapply call bellow
participants_x = sample(participants_id, x)
filter(Data, participant %in% participants_x) %>%
group_by(stimuli) %>%
summarise( mean_x = mean(judgment),
criterion = unique(criterion) ) %>%
summarise(cor = cor(.$mean_x, .$criterion))
}
N <- length(unique(Data$participant))
lapply(1:N, HelpFun, Data) %>% bind_rows()
}
MyFun(df)
问题是这段代码很慢。由于每次选择都是随机的,我 执行所有这些 10,000 次。而且这个慢。在我的机器(Windows 10、16 GB)上,1000 次模拟需要 2 分钟。 10,000 次模拟需要 20 分钟。 (我也尝试过使用循环,但它没有帮助,尽管由于某些原因它有点快)。它必须是一个更快的解决方案。毕竟,计算并没有那么复杂。 下面我写了100个模拟只是为了不干扰你的电脑。 system.time(replicate(100, MyFun(df), simple = FALSE) %>% bind_rows())
有没有让这一切变得更快的想法?
【问题讨论】:
-
首先,在外循环中移动
participants_id = unique (Data$participant)怎么样 -
谢谢。我添加了你的建议。然而,它仍然很慢......
-
@Meir 有多慢?在我的机器上 100 次复制需要 11.5 秒。我问是因为我很好奇你为什么需要它更快;您最终会将其扩展到更多复制或更高的 N 吗?您是希望其他人在某个时候在他们自己的计算机上运行的东西,还是您只是担心自己的计算时间?
-
我添加了一些精度。理想情况下,我想要 10,000 次模拟。 1000 个模拟需要 2 分钟,10,000 个大约需要 20 分钟。我认为我的代码这么慢一定有问题。
标签: r performance random dplyr combinations