2013-07-09 28 views
0

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

我很抱歉,问题不清楚。以下是我使用的示例数据集,表示块组的行以及表示漏洞维度(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“的帕累托评级方法背后的基本原理如下。我被认为是一组n个成分得分的基础上的每个情况下,{CI1,CI2,...,CIN}。 (......)假设任何单个组件上的较高分数表示更大的脆弱性,当比较两个(...)块组A和B时,情况A比情况B更脆弱,只有当A的评分为至少等于所有组件的B,并且如果至少有一个组件的评分高于B“。

我搜索了R网站,但无法找到帕累托排名的软件包。

非常感谢!

+0

你能更精确的...你想干什么? – dickoa

+0

我有一个2100行和4列的矩阵(我的主要组件,代表不同维度的漏洞)。变量的值从〜-10到〜10不等,分别表示低脆弱性和高脆弱性。我想用帕累托排序法将行分成一系列的行列。谢谢! –

回答

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)) 

Graph of the partial order