R语言--AHP层次分析法

常用的一种算法之一,虽说有主观性, 但比主观上直接对指标定权重科学一点。具体原理可以百度查。
文章包括:1.方根法求权重 2.判断矩阵的一致性检验 3.案例

方根法求权重

AHP求权重有两种方法,和积法和方根法,方根法比较好实现所以用方根法求解。

##输入:judgeMatrix 判断矩阵;round 结果约分位数
##输出:权重
weight <- function (judgeMatrix, round=3) {
  n = ncol(judgeMatrix)
  cumProd <- vector(length=n)
  cumProd <- apply(judgeMatrix, 1, prod)  ##求每行连乘积
  weight <- cumProd^(1/n)  ##开n次方(特征向量)
  weight <- weight/sum(weight) ##求权重
  round(weight, round)
}

判断矩阵一致性检验

判断矩阵的一致性检验用于检验,你的判断矩阵是否科学合理,RI值只查到了位数达到11的值。所以这段代码最多可以检验11个变量的判断矩阵。多于11个变量,可以自己查一下RI和改改代码。

###注:CRtest调用了weight函数
###输入:judgeMatrix
###输出:CI, CR
CRtest <- function (judgeMatrix, round=3){
  RI <- c(0, 0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51) #随机一致性指标
  Wi <- weight(judgeMatrix)  ##计算权重
  n <- length(Wi)
  if(n > 11){
    cat("判断矩阵过大,请少于11个指标 \n")
  }
  if (n > 2) {
    W <- matrix(Wi, ncol = 1) 
    judgeW <- judgeMatrix %*% W 
    JudgeW <- as.vector(judgeW)
    la_max <- sum(JudgeW/Wi)/n
    CI = (la_max - n)/(n - 1)
    CR = CI/RI[n]
    cat("\n CI=", round(CI, round), "\n")
    cat("\n CR=", round(CR, round), "\n")
    if (CR <= 0.1) {
      cat(" 通过一致性检验 \n")
      cat("\n Wi: ", round(Wi, round), "\n")
    }
    else {
      cat(" 请调整判断矩阵,使CR<0.1 \n")
      Wi = NULL
    }
  }
  else if (n <= 2) {
    return(Wi)
  }
  consequence <- c(round(CI, round), round(CR, round))
  names(consequence) <- c("CI", "CR")
  consequence
}

案例

随便生成了个判断矩阵,检验了一下。

b <- c(1,3,1/2,1/2,3,1/3,1,1/2,1/3,1/2,
       3,2,1,3,2,2,3,1/3,1,2,1/3,2,1/2,1/2,1)
(judgeMatix <- matrix(b, ncol=5))
     [,1]  [,2]  [,3]  [,4]   [,5]
[1,]  1.0   0.3    3    2.0    0.3
[2,]  3.0   1.0    2    3.0    2.0
[3,]  0.5   0.5    1    0.3    0.5
[4,]  0.5   0.3    3    1.0    0.5
[5,]  3.0   0.5    2    2.0    1.0

##计算权重
weight(judgeMatix)
weight(judgeMatix)
[1] 0.157 0.364 0.092 0.132 0.254

##判断矩阵一致性检验
CRtest(judgeMatix)

 CI= 0.118 
 CR= 0.105 
 请调整判断矩阵,使CR<0.1 
   CI    CR 
0.118 0.105 

你可能感兴趣的:(R语言-例子,r语言,算法)