如何运行测试集全排列:遇首个失败即终止并保留末次通过结果
测试函数全排列执行与频率统计实现方案
已知条件
现有四个独立测试函数:C、R、L、Y,测试通过时分别返回分数1、2、3、4,测试拒绝时返回0。其中R函数示例如下(逻辑正常,无需修改):
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("Fail to reject H_0, No autocorrelation, this is a Random Walk process !") model <- 2 } return(model) }
执行规则
需遍历四个函数的全部24种排列组合,按以下逻辑执行:
- 按排列顺序依次运行测试函数,一旦某函数返回非0分数(测试接受),立即终止后续测试,保留该分数
- 若所有函数均返回0(全部拒绝),最终分数记为0
统计要求
完成所有排列执行后,统计各分数出现频率,输出格式如下:
| 分数 | 频率 |
|---|---|
| 0 | 1 |
| 1 | 5 |
| 2 | 12 |
| 3 | 2 |
| 4 | 4 |
实现代码
1. 生成全排列
使用gtools包生成所有排列组合:
install.packages("gtools") # 首次使用需安装 library(gtools) # 生成4个函数名的所有排列,每行对应一个排列 all_permutations <- permutations(n = 4, r = 4, v = c("C", "R", "L", "Y"))
2. 单排列执行逻辑
编写函数处理单个排列的测试流程:
execute_perm <- function(perm_vec, series_data, alpha_val=0.05) { for (func_name in perm_vec) { # 获取对应测试函数并执行 test_result <- get(func_name)(series_data, alpha_val) if (test_result != 0) { # 测试通过,返回分数并停止 return(test_result) } } # 所有测试都被拒绝,返回0 return(0) }
3. 批量执行与频率统计
# 假设你的时间序列数据存储在series变量中 results_vector <- c() # 遍历所有排列,执行测试 for (row_idx in 1:nrow(all_permutations)) { current_perm <- all_permutations[row_idx, ] res <- execute_perm(current_perm, series) results_vector <- c(results_vector, res) } # 统计频率并整理成表格 frequency_table <- as.data.frame(table(results_vector)) colnames(frequency_table) <- c("分数", "频率") # 按分数升序排序 frequency_table <- frequency_table[order(as.numeric(frequency_table$分数)), ] # 输出结果 print(frequency_table)
内容的提问来源于stack exchange,提问作者Jinane Jouni
相关产品推荐
相关产品推荐

