Como calcular a distribuição cumulativa em R?


23

Preciso calcular a função de distribuição cumulativa de uma amostra de dados.

Existe algo semelhante ao hist () em R que mede a função de densidade cumulativa?

Eu tenho tentativas ecdf (), mas não consigo entender a lógica.

Respostas:


32

A ecdffunção aplicada a uma amostra de dados retorna uma função que representa a função de distribuição cumulativa empírica. Por exemplo:

> 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)

insira a descrição da imagem aqui

Se você deseja que um objeto representando o CDF empírico seja avaliado em valores específicos (e não como um objeto de função), poderá fazer

> 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

Observe que pcontém no máximo a mesma quantidade de informações que P(e possivelmente contém menos) que, por sua vez, contém a mesma quantidade de informações que X.


Sim, eu sei, mas como é possível acessar os valores do ecdf? isso é um mistério para mim.
Emanuele

2
Se você deseja o seu valor, xbasta escrever P(x). Note-se que xpode ser um vetor (ver o último par de frases de minha resposta.)
Chris Taylor

@ChrisTaylor A terminologia correta é a função de distribuição cumulativa empírica, não a função de densidade.
Michael R. Chernick

1

O que você parece precisar é disso para obter a distribuição acumulada (probabilidade de obter um valor <= x em uma amostra), ecdf retorna uma função, mas parece ter sido criada para plotagem e, portanto, o argumento dessa função , se fosse uma escada, seria o índice da banda de rodagem.

Você pode usar isto:

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.

Infelizmente, o uso desta função não é muito rápido. Eu não sei se R tem uma função que faz isso retornando uma função, que seria mais eficiente.


3
R[0 0,1]ecdf(c(-1,0,3,9))(8)0.75quantileR

1

Eu sempre achei ecdf()um pouco confuso. Além disso, acho que só funciona no caso univariado. Acabei rolando minha própria função para isso.

Primeiro instale o data.table . Em seguida, instale meu pacote, mltools (ou apenas copie o método empirical_cdf () no seu ambiente R.)

Então é tão fácil quanto

# 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 de um vetor

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

CDF da coluna 'x' de dt

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

CDF das colunas 'x' e 'y' de dt

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

amigo, você pode ler o código deste blog.

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

mais detalhes podem ser encontrados no seguinte link:

r cdf e histograma

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.