1

我需要帮助模拟数据集。

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

比如说,有 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 的所有可能数据。注意 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 新手,所以任何帮助都将不胜感激!

希望描述清楚。

4

1 回答 1

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)

这将返回一个数据框列表。

于 2013-02-12T12:25:44.057 回答