如何在R中用ahpsurvey构建成对比较矩阵实现层次分析法
用R的ahpsurvey包实现AHP的自动化对比矩阵构建
示例数据集
| 地点 | Var1 |
|---|---|
| A | 8 |
| B | 3 |
| C | 7 |
| D | 6 |
| E | 4 |
Satty评级标准
| 评级 | 说明 |
|---|---|
| 1/9 | 偏好特征绝对不重要 |
| 1/7 | 偏好特征强烈不重要 |
| 1/5 | 偏好特征中等不重要 |
| 1/3 | 偏好特征轻微不重要 |
| 1 | 两个特征同等重要 |
| 3 | 偏好特征轻微更重要 |
| 5 | 偏好特征中等更重要 |
| 7 | 偏好特征强烈更重要 |
| 9 | 偏好特征绝对更重要 |
问题描述
构建AHP对比矩阵时,手动逐个填充的方式在面对100+地点时效率极低。原手动代码如下:
num_alternatives <- length(location) mat <- matrix(0, nrow = num_alternatives, ncol = num_alternatives) colnames(comparison_matrix) <- location rownames(comparison_matrix) <- location # 对比地点A与其他地点的Var1值 x_dta$a_diff <- 8 - x_dta$Var1 x_dta$a_diff <- as.character(x_dta$a_diff) # 为差异值匹配Satty评级 diff_lookup <- c(`0` = 1, `5` = 7, `1` = 3, `2` = 5, `4` =7) # 手动填充A行的对比值 mat["A","B"] <- 7 mat["A","C"] <- 3 mat["A","D"] <- 5 mat["A","E"] <- 7 # 重复此过程填充完整矩阵,100+地点时耗时极长
解决方案
通过嵌套循环自动构建对比矩阵,核心逻辑是遍历所有地点两两组合,根据Var1差值匹配Satty评级,同时处理倒数关系(若i比j的评级为k,则j比i为1/k)。
代码实现
# 加载示例数据(替换为你的真实数据集) x_dta <- data.frame( 地点 = c("A", "B", "C", "D", "E"), Var1 = c(8, 3, 7, 6, 4) ) # 定义完整的差值-Satty评级映射(包含正负差值) diff_lookup <- c( "-5" = 1/7, "-4" = 1/7, "-2" = 1/5, "-1" = 1/3, "0" = 1, "1" = 3, "2" = 5, "4" = 7, "5" =7 ) # 获取地点列表 locations <- x_dta$地点 n <- length(locations) # 初始化对比矩阵,设置行名列名 comparison_matrix <- matrix(0, nrow = n, ncol = n, dimnames = list(locations, locations)) # 自动填充矩阵 for (i in 1:n) { for (j in 1:n) { if (i == j) { comparison_matrix[i, j] <- 1 # 自身对比赋值为1 } else { # 计算当前两两组合的Var1差值并转为字符型 diff_val <- as.character(x_dta$Var1[i] - x_dta$Var1[j]) # 匹配对应Satty评级 comparison_matrix[i, j] <- as.numeric(diff_lookup[diff_val]) } } } # 查看生成的对比矩阵 print(comparison_matrix)
关键说明
- 映射规则
diff_lookup覆盖了正负差值对应的评级,确保矩阵的互反性(A/B的评级与B/A的评级互为倒数) - 循环自动处理所有地点的两两组合,无需手动填充
- 矩阵行、列以地点命名,直接符合ahpsurvey包的输入格式要求
- 针对100+地点的数据集,该代码能高效完成矩阵构建,时间复杂度为O(n²),在R中处理仅需极短时间
内容的提问来源于stack exchange,提问作者Mizzlwe
相关产品推荐
相关产品推荐

