我需要帮助模拟数据集。
应该模拟信号检测理论任务的所有可能结果(参与者被提交试验并且必须决定他们是否检测到给定信号)。现在,我需要一个包含不同试验次数的所有可能值的数据集。
说,有6个试验,5个信号存在,5个没有信号。我只对正确的检测(命中)和误报(I型错误)感兴趣。参与者可以在1(我不需要0)和5之间正确检测并发出相同数量的误报。对于所有可能的组合,这将是包含两个变量的数据集,每个变量具有5 ^ 2个案例。为了使事情变得更复杂,即使试验次数也是多变的。信号和非信号试验的数量可以在1到20之间变化,但试验总数不能少于3(1S试验和2次非S试验,或者相反)。对于每种可能的试验组合,都有一组可能的命中和误报组合。
我需要的是一个包含5个变量的数据集(S个试验的总N,N个,N个非S试验,N个命中数和N个虚假警报数)以及所有可能的值。
示例 以下是总N为4的所有可能数据。请注意,Signal + Noise = N_total和N_Hit seq(1:Signal)和N_FA seq(1:Noise)
N_total Signal Noise N_Hit N_FA
4 1 3 1 1
4 1 3 1 2
4 1 3 1 3
4 2 2 1 1
4 2 2 1 2
4 2 2 2 1
4 2 2 2 2
4 3 1 1 1
4 3 1 2 1
4 3 1 3 1
我是R新手,所以任何帮助都会非常感激!
希望描述清楚。
答案 0 :(得分:0)
我创建了一个函数,它使用试验次数作为参数。
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")))
}
使用功能:
> 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
如何将此功能应用于值3-40:
lapply(3:40, myfunc)
这将返回数据框列表。