R语言 如何运行测试集的所有排列,在第一次“失败”时中断,并保留每个排列的最后“通过”的结果

axkjgtzd  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(111)

我有多个测试要对我的数据执行。我已经为每个测试单独构建了一个函数。例如,这里是一个测试的函数(这不是我们关心的问题,它运行得很好):

R <- function(series, alpha=0.05) {
  library(tseries)
  library(LSTS)
  model <- 0
  ######################### Random Walk test #########################
  #H0: iid residuals
  RW <- Box.test(series, lag=1, type="Ljung")
  p_value3 <- RW$p.value
  if (p_value3 > alpha) {print("Failt to reject H_0, No autocorrolation, this is a Random Walk process !")
    model <- 2 
  }
  return(model)
}

字符串
为了总结,我有四个函数,每个函数执行一个测试。这些函数是“C”、“R”、“L”和“Y”,每个函数分别返回分数1、2、3和4。
我想做一个测试的排列,但我不知道我如何才能完成所有24个组合。
Perumentation 1:CLYR从“C”测试开始,如果拒绝,则进行“L”测试,如果拒绝,则进行“Y”测试,如果拒绝,则进行“R”测试。
注意:一旦测试被接受,我们停止并保留返回的分数。注意:如果所有测试都被拒绝,则得分为0
在24个排列结束时,我们计算得分的频率。例如,在一个示例中,
| 频率| Frequency |
| --| ------------ |
| 1| 1 |
| 五| 5 |
| 十二岁| 12 |
| 二个| 2 |
| 四| 4 |

sczxawaw

sczxawaw1#

关于:

library(combinat) ## provides permutation function "permn"

字符串

  • 定义测试列表:
tests <- list(
  C = list(f = \(x) {x < 10},  score = 1),
  R = list(f = \(x) {x < 30},  score = 2),
  L = list(f = \(x) {x < 50},  score = 3),
  Y = list(f = \(x) {x < Inf}, score = 4)
)

  • 获取排列列表:
perms <- combinat::permn(c('C', 'R', 'L', 'Y'))
## > perms
## [[1]]
## [1] "C" "R" "L" "Y"
## 
## [[2]]
## [1] "C" "R" "Y" "L"
## truncated
  • 迭代排列,根据每个排列对测试列表进行 Shuffle ,按照 Shuffle 顺序对测试函数进行do.call,识别最近通过(在第一次失败之前)测试的索引,并检索相关分数:
perms |>
  Map(f = \(perm) {
    tests_shuffled <- tests[perm]
    latest_pass <- - 1 + which(tests_shuffled |> 
                              Map(f = \(test) do.call(test$f, list(x = 42))) == FALSE
                              )[1]
    score <- ifelse(latest_pass < 1, 0, tests_shuffled[[latest_pass]]$score)
    c(paste(perm, collapse = ''), score)
  }) |>
  Reduce(f = rbind) |>
  as.data.frame(row.names = FALSE) |>
  setNames(nm = c('perm', 'score'))


输出:

perm score
1  CRLY     0
2  CRYL     0
3  CYRL     0
4  YCRL     4
5  YCLR     4
6  CYLR     0
7  CLYR     0
8  CLRY     0
9  LCRY     3
## truncated

  • 要将分数制表,请将上面的输出存储到object中并将其table,或者简单地将|> (\(.) table(.$score))()附加到前面的管道中:
## +   setNames(nm = c('perm', 'score')) |>
## +   (\(.) table(.$score))()
 0  3  4 
12  6  6

相关问题