如何计算R中的累积分布?


23

我需要计算数据样本的累积分布函数。

R中是否有类似于hist()的东西来测量累积密度函数?

我尝试过ecdf(),但我听不懂逻辑。

Answers:


32

ecdf函数应用于数据样本返回一个函数表示经验累积分布函数。例如:

> X = rnorm(100) # X is a sample of 100 normally distributed random variables
> P = ecdf(X)    # P is a function giving the empirical CDF of X
> P(0.0)         # This returns the empirical CDF at zero (should be close to 0.5)
[1] 0.52
> plot(P)        # Draws a plot of the empirical CDF (see below)

在此处输入图片说明

如果您想要一个代表经验CDF的对象以特定值进行评估(而不是作为函数对象),则可以执行

> z = seq(-3, 3, by=0.01) # The values at which we want to evaluate the empirical CDF
> p = P(z)                # p now stores the empirical CDF evaluated at the values in z

请注意,p它最多包含与相同数量的信息P(可能包含的信息更少),而后者又包含与相同数量的信息X


是的,我知道,但是如何访问ecdf的值呢?对我来说这是一个谜。
emanuele 2012年

2
如果您想要它的价值,x只需编写P(x)。请注意,这x可以是一个向量(请参阅我的回答的最后两句话。)
克里斯·泰勒

@ChrisTaylor正确的术语是经验累积分布函数,而不是密度函数。
Michael R. Chernick 2012年

1

您似乎需要这样做是为了获得累积分布(在样本中获得值<=而不是x的概率),ecdf返回给您一个函数,但是它似乎是用于绘图的,因此该函数的参数,如果是楼梯,则为胎面的索引。

您可以使用此:

acumulated.distrib= function(sample,x){
    minors= 0
    for(n in sample){
        if(n<=x){
            minors= minors+1
        }
    }
    return (minors/length(sample))
}

mysample = rnorm(100)
acumulated.distrib(mysample,1.21) #1.21 or any other value you want.

遗憾的是,此功能的使用不是很快。我不知道R是否具有执行此操作的功能,可以返回您所需要的功能,这样会更有效。


3
您似乎将ECDF与它的反函数混淆了。 R确实可以计算ECDF:其自变量是随机变量的潜在值,并且返回间隔。这很容易检查。例如,return 。ECDF的广义逆是分位数函数,由in 实现。[0,1]ecdf(c(-1,0,3,9))(8)0.75quantileR
whuber

1

我总是觉得ecdf()有些困惑。另外,我认为它仅适用于单变量情况。最终为此滚动了我自己的函数。

首先安装data.table。然后安装我的软件包mltools(或仅将empirical_cdf()方法复制到R环境中。)

然后就像

# load packages
library(data.table)
library(mltools)

# Make some data
dt <- data.table(x=c(0.3, 1.3, 1.4, 3.6), y=c(1.2, 1.2, 3.8, 3.9))
dt
     x   y
1: 0.3 1.2
2: 1.3 1.2
3: 1.4 3.8
4: 3.6 3.9

载体的CDF

empirical_cdf(dt$x, ubounds=seq(1, 4, by=1.0))
   UpperBound N.cum  CDF
1:          1     1 0.25
2:          2     3 0.75
3:          3     3 0.75
4:          4     4 1.00

dt的“ x”列的CDF

empirical_cdf(dt, ubounds=list(x=seq(1, 4, by=1.0)))
   x N.cum  CDF
1: 1     1 0.25
2: 2     3 0.75
3: 3     3 0.75
4: 4     4 1.00

dt的“ x”和“ y”列的CDF

empirical_cdf(dt, ubounds=list(x=seq(1, 4, by=1.0), y=seq(1, 4, by=1.0)))
    x y N.cum  CDF
 1: 1 1     0 0.00
 2: 1 2     1 0.25
 3: 1 3     1 0.25
 4: 1 4     1 0.25
 5: 2 1     0 0.00
 6: 2 2     2 0.50
 7: 2 3     2 0.50
 8: 2 4     3 0.75
 9: 3 1     0 0.00
10: 3 2     2 0.50
11: 3 3     2 0.50
12: 3 4     3 0.75
13: 4 1     0 0.00
14: 4 2     2 0.50
15: 4 3     2 0.50
16: 4 4     4 1.00

1

朋友,您可以在此博客上阅读代码。

sample.data = read.table ('data.txt', header = TRUE, sep = "\t")
cdf <- ggplot (data=sample.data, aes(x=Delay, group =Type, color = Type)) + stat_ecdf()
cdf

可以在以下链接上找到更多详细信息:

r cdf和直方图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.