簡體   English   中英

如何繪制分箱數據的累積分布函數 (CDF)?

[英]How can I plot a cumulative distribution function (CDF) for binned data?

我有離散數據,例如在范圍內呈現

         Marks Freq cumFreq 
1  (37.9,43.1]    4       4    
2  (43.1,48.2]   16      20   
3  (48.2,53.3]   76      96    

我需要為這些數據繪制 cmf,我知道有

plot(ecdf(x))

但我不知道要添加什么才能擁有我需要的東西。

這里有幾個選項:

library(ggplot2)
library(scales)
library(dplyr)

## Fake data
set.seed(2)
dat = data.frame(score=c(rnorm(130,40,10), rnorm(130,80,5)))

如果您有原始數據,以下是繪制 ECDF 的方法:

# Base graphics
plot(ecdf(dat$score))

# ggplot2
ggplot(dat, aes(score)) +
  stat_ecdf(aes(group=1), geom="step")

如果您只有匯總數據,這是繪制 ECDF 的一種方法:

首先,讓我們將數據分組到 bin 中,類似於您在問題中的情況。 我們使用cut函數創建 bin,然后創建一個新的pct列來計算每個 bin 占分數總數的分數。 我們使用dplyr鏈接運算符 ( %>% ) 在一個“函數鏈”中完成所有操作。

dat.binned = dat %>% count(Marks=cut(score,seq(0,100,5))) %>%
         mutate(pct = n/sum(n))

現在我們可以繪制它。 cumsum(pct)計算累積百分比(如您問題中的cumFreq )。 geom_step使用這些累積百分比創建階梯圖。

ggplot(dat.binned, aes(Marks, cumsum(pct))) +
  geom_step(aes(group=1)) +
  scale_y_continuous(labels=percent_format()) 

以下是情節的樣子:

在此處輸入圖片說明

在此處輸入圖片說明

在此處輸入圖片說明

這個怎么樣:

library(ggplot2)
library(scales)
library(dplyr)

set.seed(2)
dat = data.frame(score = c(rnorm(130,40,10), rnorm(130,80,5)))
dat.binned = dat %>% count(Marks = cut(score,seq(0,100,5))) %>%
         mutate(pct = n/sum(n))
ggplot(data = dat.binned, mapping = aes(Marks, cumsum(pct))) +  
  geom_line(aes(group = 1)) + 
  geom_point(data = dat.binned, size = 0.1, color = "blue") +
  labs(x = "Frequency(Hz)", y = "Axis") +
  scale_y_continuous(labels = percent_format()) 

在此處輸入圖片說明

暫無
暫無

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

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