簡體   English   中英

如何根據 r 中的 ecdf 進行排名?

[英]How to rank based on ecdf in r?

此代碼將創建一個 ecdf 圖形,其中數字 5 的曲線代表真相。

   library(data.table)
   library(ggplot2)
   set.seed(123)
   dat_data <- data.table(meanval = rnorm(10),
                   sdval = runif(10, 0.5, 3),
                   rep = sample.int(1000, 10))

   dat <- rbindlist(lapply(1:dim(dat_data)[1], 
   function(x) data.table(rowval = x, dist = rnorm(dat_data[x, 
   rep],dat_data[x, meanval], dat_data[x, sdval]))))
   ggplot(dat, aes(x = dist, group = factor(rowval), color = 
   factor(rowval))) +
   stat_ecdf(size = 2)

根據 ecdf 的輸出,我想將數字從最接近 5 到最遠離 5 進行排名。

這是對它們進行排名的想法。

首先,作為參考,我繪制了它,但添加了linetype=所以我可以更容易地看到5

library(ggplot2)
ggplot(dat, aes(x = dist, group = factor(rowval), color = factor(rowval), linetype = rowval != 5)) +
  stat_ecdf(size = 2) +
  scale_linetype_discrete(guide = FALSE)

10條經驗累積分布曲線,用於比較

使用data.table ,我將沿着它們的分位數測量 51 個點(每0.02 )的差異:

library(data.table)
quants <- seq(0, 1, length.out = 51)
datquants <- dat[, .(quant = quants, val = ecdf(dist)(quantile(dist, quants))), by = rowval]
datquants
#      rowval quant         val
#       <int> <num>       <num>
#   1:      1  0.00 0.001540832
#   2:      1  0.02 0.020030817
#   3:      1  0.04 0.040061633
#   4:      1  0.06 0.060092450
#   5:      1  0.08 0.080123267
#   6:      1  0.10 0.100154083
#   7:      1  0.12 0.120184900
#   8:      1  0.14 0.140215716
#   9:      1  0.16 0.160246533
#  10:      1  0.18 0.180277350
#  ---                         
# 501:     10  0.82 0.819905213
# 502:     10  0.84 0.840047393
# 503:     10  0.86 0.859004739
# 504:     10  0.88 0.879146919
# 505:     10  0.90 0.899289100
# 506:     10  0.92 0.919431280
# 507:     10  0.94 0.939573460
# 508:     10  0.96 0.959715640
# 509:     10  0.98 0.979857820
# 510:     10  1.00 1.000000000

(注意:此答案的先前版本未使用ecdf ,如果每個rowval內的范圍不同,則會暴露/錯誤。使用ecdf ,我們所有的面積計算都在同一個域中。)

從這里,我們將5分位數分開,根據quant重新加入,找到絕對差異,然后總結。

datquants[rowval == 5, .(quant, val5 = val)
  ][datquants, on = .(quant)
  ][, val := abs(val - val5)^2
  ][, .(area = 1e6*sum(val)), by = rowval
  ][, rank := rank(area) ]
#     rowval      area  rank
#      <int>     <num> <num>
#  1:      1  22.45959     7
#  2:      2  18.93004     4
#  3:      3 160.48164    10
#  4:      4  17.66167     2
#  5:      5   0.00000     1
#  6:      6  21.52974     6
#  7:      7  24.35520     8
#  8:      8  18.48263     3
#  9:      9  59.90059     9
# 10:     10  19.78913     5

我認為平方和(差異)是一個很好的衡量標准,不確定它是否是最好的。 1e6*只是將數字帶入非指數 realm 以便於視覺比較。)

免責聲明:這是一種方法,也許只是一種啟發式方法,因為我不確定它是唯一或最好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM