/ / Uzyskanie prawdopodobieństwa gęstości danych - r, wykres, prawdopodobieństwo, rozkład, analiza danych

Uzyskanie gęstości prawdopodobieństwa danych - r, wykres, prawdopodobieństwo, rozkład, analiza danych

Muszę przeanalizować niektóre dane o Interneciesesje dla linii DSL. Chciałem zobaczyć, jak rozkładają się czasy trwania sesji. Uznałem, że prostym sposobem na zrobienie tego byłoby rozpoczęcie od wykresu gęstości prawdopodobieństwa czasu trwania wszystkich sesji.

Załadowałem dane do R i użyłem density() funkcjonować. To było coś takiego

plot(density(data$duration), type = "l", col = "blue", main = "Density Plot of Duration",
xlab = "duration(h)", ylab = "probability density")

Jestem nowy w R i tego rodzaju analizach. To właśnie znalazłem, przeglądając google. Mam fabułę, ale pozostały mi pytania. Czy to właściwa funkcja do robienia tego, co próbuję zrobić, czy jest coś jeszcze?

Na wykresie stwierdziłem, że skala osi Y wynosiła od 0 ... 1,5. Nie rozumiem, jak może być 1,5, czy nie powinno być od 0 ... 1?

Chciałbym również uzyskać gładszą krzywą. Ponieważ zestaw danych jest naprawdę duży, linie są naprawdę postrzępione. Przyjemniej byłoby je wygładzić, kiedy to prezentuję. Jak miałbym to zrobić?

Odpowiedzi:

10 dla odpowiedzi № 1

Jak powiedział Nico, powinieneś sprawdzić hist, ale możesz także połączyć oba z nich. Wtedy możesz nazwać gęstość za pomocą lines zamiast. Przykład:

duration <- rpois(500, 10) # For duration data I assume Poisson distributed
hist(duration,
probability = TRUE, # In stead of frequency
breaks = "FD",      # For more breaks than the default
col = "darkslategray4", border = "seashell3")
lines(density(duration - 0.5),   # Add the kernel density estimate (-.5 fix for the bins)
col = "firebrick2", lwd = 3)

Powinien dać ci coś takiego: Histogram czasu trwania

Zauważ, że oszacowanie gęstości jądra domyślnie zakłada jądro Gaussa. Ale przepustowość jest często najważniejszym czynnikiem. Jeśli zadzwonisz density bezpośrednio zgłasza domyślną szacowaną przepustowość:

> density(duration)

Call:
density.default(x = duration)

Data: duration (500 obs.);      Bandwidth "bw" = 0.7752

x                 y
Min.   : 0.6745   Min.   :1.160e-05
1st Qu.: 7.0872   1st Qu.:1.038e-03
Median :13.5000   Median :1.932e-02
Mean   :13.5000   Mean   :3.895e-02
3rd Qu.:19.9128   3rd Qu.:7.521e-02
Max.   :26.3255   Max.   :1.164e-01

Tutaj jest 0,7752. Sprawdź, czy nie ma danych, i baw się nimi, jak sugeruje Nico. Możesz na to spojrzeć ?bw.nrd.


2 dla odpowiedzi nr 2

Powinieneś grać z bandwith (bw), aby zmienić gładkość krzywej. Zasadniczo R wykonuje dobrą robotę i automatycznie daje ładną i płynną krzywą, ale może nie jest tak w przypadku konkretnego zestawu danych.

Jeśli chodzi o połączenie, którego używasz, tak, jest poprawne, type="l" nie jest konieczne, jest to domyślne ustawienie używane do kreślenia obiektów gęstości. Obszar pod krzywą (tj. całka od -Inf do + Inf funkcji gęstości) będzie wynosił = 1.

Czy krzywa gęstości jest najlepszym rozwiązaniem w twoim przypadku? Może, a może nie ... to naprawdę zależy od tego, jaki rodzaj analizy chcesz wykonać. Prawdopodobnie za pomocą hist będą wystarczające, a może nawet bardziej pouczające, ponieważ możesz wybrać określone przedziały czasu trwania (patrz ?hist po więcej informacji).


1 dla odpowiedzi nr 3

Chciałem dodać to jako komentarz dopoprzednia odpowiedź, ale jest za duża. Widoczne pochylenie wynika ze sposobu, w jaki wartości są dzielone na histogram. Często błędem jest stosowanie histogramów do dyskretnych danych. Zobacz poniżej ...

set.seed(1001)
tmpf <- function() {
duration <- rpois(500, 10) # For duration data I assume Poisson distributed
hist(duration,
probability = TRUE, # In stead of frequency
breaks = "FD",      # For more breaks than the default
col = "darkslategray4", border = "seashell3",
main="",ann=FALSE,axes=FALSE,xlim=c(0,25),ylim=c(0,0.15))
box()
lines(density(duration),   # Add the kernel density estimate
col = "firebrick2", lwd = 3)
par(new=TRUE)
plot(table(factor(duration,levels=0:25))/length(duration),
xlim=c(0,25),ylim=c(0,0.15),col=4,ann=FALSE,axes=FALSE)
}

par(mfrow=c(3,3),mar=rep(0,4))
replicate(9,tmpf())