You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中用ahpsurvey构建成对比较矩阵实现层次分析法

用R的ahpsurvey包实现AHP的自动化对比矩阵构建

示例数据集

地点Var1
A8
B3
C7
D6
E4

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:17:04