根据R中的特定规则进行数据模拟
我需要帮助模拟数据集 它应该模拟信号检测理论任务中的所有可能结果(参与者接受试验,并决定他们是否检测到给定信号)。现在,我需要一个包含所有可能值的数据集,用于不同数量的试验 比如说,有6次试验,5次出现信号,5次没有信号。我只对正确检测(点击)和错误报警(I类错误)感兴趣。参与者可以正确检测1(我不需要0)到5之间的错误警报,并发出相同数量的错误警报。对于所有可能的组合,这将是包含两个变量的数据集,每个变量有5^2个案例。让事情变得更复杂的是,即使是审判的次数也是可变的。信号和非信号试验的数量可以在1到20之间变化,但试验总数不能少于3次(1次S试验和2次非S试验,或者相反)。对于每种可能的试验组合,都有一组可能的命中和假警报组合 我需要的是一个包含5个变量的数据集(总N、N个S试验、N个非S试验、N个命中和N个假警报),以及所有可能的值 示例 以下是总N为4的所有可能数据。请注意,信号+噪声=N_总数,N_命中顺序(1:信号)和N_FA顺序(1:噪声) 我是一个新手,所以任何帮助都将不胜感激根据R中的特定规则进行数据模拟,r,R,我需要帮助模拟数据集 它应该模拟信号检测理论任务中的所有可能结果(参与者接受试验,并决定他们是否检测到给定信号)。现在,我需要一个包含所有可能值的数据集,用于不同数量的试验 比如说,有6次试验,5次出现信号,5次没有信号。我只对正确检测(点击)和错误报警(I类错误)感兴趣。参与者可以正确检测1(我不需要0)到5之间的错误警报,并发出相同数量的错误警报。对于所有可能的组合,这将是包含两个变量的数据集,每个变量有5^2个案例。让事情变得更复杂的是,即使是审判的次数也是可变的。信号和非信号试验的数量可
希望描述清楚。我创建了一个函数,它使用试验次数作为参数
myfunc <- function(n) {
# create a data frame of all combinations
grid <- expand.grid(rep(list(seq_len(n - 1)), 4))
# remove invalid combinations (keep valid ones)
grid <- grid[grid[3] <= grid[1] & # number of hits <= number of signals
grid[4] <= grid[2] & # false alarms <= noise
(grid[1] + grid[2]) == n , ] # signal and noise sum to total n
# remove signal and noise > 20
grid <- grid[!rowSums(grid[1:2] > 20), ]
# sort rows
grid <- grid[order(grid[1], grid[3], grid[4]), ]
# add total number of trials
res <- cbind(n, grid)
# remove row names, add column names and return the object
return(setNames("rownames<-"(res, NULL),
c("N_total", "Signal", "Noise", "N_Hit", "N_FA")))
}
如何将此函数应用于值3-40:
lapply(3:40, myfunc)
这将返回一个数据帧列表。描述让我感到困惑。如果您提供了一些您试图生成的数据的样本行,那么就更容易理解了。这听起来像是一个“所有排列”的问题,但是如果没有关于数据约束和结果数据结构的更多细节,我不确定我们是否可以帮助您。请更新您的问题,使其更加明确。谢谢您的评论。这可能更清楚一点吗?是的。你会注意到它也引出了一个答案,所以你知道你的编辑是有效的。那太棒了,谢谢!我还在想你在那里做了什么。如果我可以再问两件事:有没有办法将信号和噪声的最大值设置为20,这样当我执行myfunc(40)时,它只返回signal和noise@user2062339的值,为什么要用3-40的值运行函数,尽管最大值应该是20?所以我设法限制了最大值,但我仍然不知道如何一次性运行myfunc(3到40)…很抱歉没有充分解释我自己。信号和噪声试验的数量应该限制在20(我已经这样做了),而不是总数N。这意味着myfunc(40)在信号和噪声列中只有20的值。这有意义吗?@user2062339信号和噪声试验的总和怎么可能低于试验的绝对数量?
> myfunc(4)
N_total Signal Noise N_Hit N_FA
1 4 1 3 1 1
2 4 1 3 1 2
3 4 1 3 1 3
4 4 2 2 1 1
5 4 2 2 1 2
6 4 2 2 2 1
7 4 2 2 2 2
8 4 3 1 1 1
9 4 3 1 2 1
10 4 3 1 3 1
lapply(3:40, myfunc)