根据R中的具体规则进行数据模拟

时间:2013-02-11 18:59:33

标签: r

我需要帮助模拟数据集。

应该模拟信号检测理论任务的所有可能结果(参与者被提交试验并且必须决定他们是否检测到给定信号)。现在,我需要一个包含不同试验次数的所有可能值的数据集。

说,有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新手,所以任何帮助都会非常感激!

希望描述清楚。

1 个答案:

答案 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)

这将返回数据框列表。