簡體   English   中英

計數的累積分布 function 作為數據子集的比率

[英]Cumulative distribution function of count as ratio for subset of data

我正在嘗試從一個 plot 上的多個數據中的 plot CDF 獲取子集范圍。 我將它們子集化,因為值可能非常大,並且我不希望 x 軸范圍很大。 無論子集范圍如何,CDF 始終具有從 0 到 1 的 y 軸范圍。由於數據存在於子集范圍之外,CDF 永遠不應 go 為 1,而是略小的比率。 我如何 go 計算整個分布的 CDF,然后在 plot 中對它們進行子集化?

此代碼繪制 CDF,但它們不考慮存在超出 x 軸范圍的數據。 在 x=50 或附近,y=1,這是不可能的。 我嘗試了其他一些stat_ecdf選項(下面注釋# ),但沒有成功。

library(moments)
library(ggplot2)
library(plyr)
library(dplyr)
library(reshape2)
library(RColorBrewer)
library(cowplot)
library(scales)
library(gridExtra)
require(data.table)
require(grid)

set.seed(8)

dat1 <- data.frame(a = replicate(1,sample(25:300,1000,rep=TRUE)))
dat2 <- data.frame(b = replicate(1,sample(25:350,950,rep=TRUE)))
dat3 <- data.frame(c = replicate(1,sample(25:400,965,rep=TRUE)))
dat4 <- data.frame(d = replicate(1,sample(25:450,970,rep=TRUE)))

d1_bind = bind_rows(dat1,dat2,dat3,dat4)

md1 <- melt(d1_bind)
colnames(md1) <- c("Dat","Value")
summary(md1)

ggplot(md1, aes(x = Value, color=Dat, linetype=Dat)) +
           stat_ecdf(aes(color = Dat),
#           pad = TRUE, # this does not plot correctly
#           n = 38850, # this or set to NULL does not plot correctly
           geom = "line", size = 1) +
           scale_linetype_manual(values=c("solid", "solid", "solid", "solid")) +
           scale_y_continuous(limits = c(0, 1.0), breaks = seq(0, 1.0, by = 0.05)) +
           scale_x_continuous(limits = c(25, 50)) +
#           scale_x_discrete(breaks = 26:451) + # this does not plot correctly
           scale_color_manual(values = c("#000000", "#E69F00", "#56B4E9", "#009E73"))

quit()

使用stat_bin並手動計算累積和,得到與上面的 stat_ecdf 相同的stat_ecdf

ggplot(md1, aes(x = Value, color=Dat, linetype=Dat)) +
  stat_bin(aes(y = cumsum(..count..)/sum(..count..)),
  geom = "line", size = 1) +
  scale_linetype_manual(values=c("solid", "solid", "solid", "solid")) +
  scale_y_continuous(limits = c(0, 1.0), breaks = seq(0, 1.0, by = 0.05)) +
  scale_x_continuous(limits = c(25, 50)) +
  scale_color_manual(values = c("#000000", "#E69F00", "#56B4E9", "#009E73"))

您的代碼和以下代碼給出,這是我所期望的:

library(dplyr)
library(tidyr)
library(ggplot2)

set.seed(8)

dat1 <- data.frame(a = replicate(1,sample(25:300,1000,rep=TRUE)))
dat2 <- data.frame(b = replicate(1,sample(25:350,950,rep=TRUE)))
dat3 <- data.frame(c = replicate(1,sample(25:400,965,rep=TRUE)))
dat4 <- data.frame(d = replicate(1,sample(25:450,970,rep=TRUE)))

df <- bind_rows(dat1, dat2, dat3, dat4, .id = "dat")

df1 <- df %>% 
  pivot_longer(cols = a:d, values_drop_na = T)

ggplot(df1, aes(x = value, color = dat, linetype = dat)) + 
  stat_ecdf(aes(color = dat))

在此處輸入圖像描述

如果您想在不重新計算 ECDF 的情況下設置限制(即在圖表上“放大”),則使用coord_cartesian而不是scale_x_continuous

ggplot(df1, aes(x = value, color = dat, linetype = dat)) +
  stat_ecdf() + 
  coord_cartesian(xlim = c(25, 50),
                  ylim = c(0, 0.1))

在此處輸入圖像描述

暫無
暫無

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

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