1

我正在使用块级人口普查数据来计算社会脆弱性指数 (SoVI),遵循 Cutter,2003 年的方法。我通过 PCA 生成了 4 个主成分分数,我想使用 Pareto 排名将块组组织成一系列排名(根据 Rygel 等人,2006:构建社会脆弱性指数的方法)。

我很抱歉这个问题不清楚。下面是我使用的示例数据集,行代表块组,列代表漏洞维度(PCA 组件分数)。我想在新列中使用 Pareto 方法根据 4 个漏洞维度计算排名。

sovi<-structure(list(deprivation = c(4.28, 4.91, 7.63, 
1.33,6.03,6.40,-0.21,6.72,-1.45,5.76), 
oldage = c(1.04,0.87,1.14,0.18,0.75,0.93,1.29,0.81,5.57,1.28),
housing = c(1.57, 1.41, 2.27, 0.21,0.97,2.65,-0.33,1.68,-1.72,1.78), 
education = c(-3.65,-1.73,-3.57,-3.37,-3.20,-2.06,-0.59,-2.93,-0.40,-3.09)), 
.Names = c("deprivation", "oldage", "housing", "education"),
row.names=c(NA,10L), class = "data.frame") 

来自 Rygel,“Pareto 排序方法背后的基本原理如下。每个案例 i 都基于一组 n 个分量得分 {ci1, ci2, . . . , cin} 来考虑。(...) 它是假设任何单个组件的得分越高表明脆弱性越大。当比较两个 (...) 块组 A 和 B 时,仅当 A 的分数至少等于 B 的分数时,案例 A 比案例 B 更容易受到攻击对于所有组件,并且如果至少有一个组件的 A 得分高于 B”。

我搜索了 R 网站,但找不到进行帕累托排名的包。

非常感谢!

4

1 回答 1

0

您引用的定义仅定义了部分顺序:您拥有的组件越多,可比较的组就越少。

您可以使用双循环或outer, 来比较所有可能的组对,并igraph绘制结果。

n <- nrow(sovi)
a <- outer(1:n, 1:n, Vectorize( function(i,j) 
  all( sovi[i,] >= sovi[j,] ) && 
  any( sovi[i,] >  sovi[j,] ) 
) )
library(igraph)
g <- graph.adjacency(a)
plot(g)

# Remove the edges that can be inferred by transitivity
hasse <- function(g) {
  # Inspired from:
  #   http://web.bahcesehir.edu.tr/atabey_kaygun/other/hasse-local.html
  es <- get.edgelist(g)
  for( e in 1:nrow(es) ) { 
    i <- es[e,1]
    j <- es[e,2]
    g[i,j] <- FALSE
    p <- get.shortest.paths(g,i,j)
    if( length(p[[1]]) == 0 ) {
      g[i,j] <- TRUE 
    } else { 
      cat( "Removing edge ", i, "-", j, " because of ", paste(p[[1]],collapse="-"), "\n", sep="")
    }
  }
  g
}
plot(hasse(g))

偏序图

于 2013-07-10T08:33:08.460 回答