[英]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)
使用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.