밀도 곡선을 R의 히스토그램에 맞추기


91

R에 곡선을 히스토그램에 맞추는 함수가 있습니까?

다음과 같은 히스토그램이 있다고 가정 해 보겠습니다.

hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))

정상처럼 보이지만 비뚤어졌습니다. 이 히스토그램을 감싸기 위해 기울어 진 정규 곡선을 맞추고 싶습니다.

이 질문은 다소 기본적이지만 인터넷에서 R에 대한 답을 찾을 수없는 것 같습니다.


가우스 분포 N (m, s)이 데이터에 맞는 m과 s를 찾고 싶습니까?
SteinNorheim

무슨 뜻인지 잘 모르겠습니다 ...> _>
user5243421

10
@mathee : 나는 그가 m = 평균, s = 표준 편차를 의미한다고 생각합니다. 가우스 분포는 정규 분포의 또 다른 이름입니다.
Peter Mortensen

답변:


154

질문을 올바르게 이해했다면 히스토그램과 함께 밀도 추정치를 원할 것입니다.

X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE)            # prob=TRUE for probabilities not counts
lines(density(X))             # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted")   # add another "smoother" density

잠시 후 편집 :

다음은 좀 더 차려 입은 버전입니다.

X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE, col="grey")# prob=TRUE for probabilities not counts
lines(density(X), col="blue", lwd=2) # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted", col="darkgreen", lwd=2) 

그래프와 함께 다음을 생성합니다.

여기에 이미지 설명 입력


3
+1-히스토그램에 맞게 밀도 플롯을 조정하는 것과 같이 반대로 할 수도 있습니까?
vonjd

2
lines(density(X,na.rm= TRUE)벡터에 NA 값이 포함될 수 있으므로에 추가 매개 변수를 제공하는 것이 좋습니다 .
Anirudh 2014 년

30

ggplot2를 사용하면 이러한 작업이 쉽습니다.

library(ggplot2)
dataset <- data.frame(X = c(rep(65, times=5), rep(25, times=5), 
                            rep(35, times=10), rep(45, times=4)))
ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..)) + 
  geom_density()

또는 Dirk 솔루션의 결과를 모방하기 위해

ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..), binwidth = 5) + 
  geom_density()

28

내가하는 방법은 다음과 같습니다.

foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)

보너스 연습은 ggplot2 패키지로 이것을 수행하는 것입니다 ...


그러나 왜곡 된 것을 원하는 경우 위에서 밀도 예제를 수행하거나 데이터를 변환하거나 (예 : foo.log & lt;-log (foo) 위를 시도) 또는 다음과 같이 왜곡 된 분포를 맞출 수 있습니다. 감마 또는 로그 정규 (lognormal은 로그를 취하고 정규, btw를 피팅하는 것과 동일 함).
John Johnson

2
그러나 여전히 먼저 분포의 모수를 추정해야합니다.
Dirk Eddelbuettel

우리가 이론적 통계에 더 많이 들어가기 때문에 단순히 R에 대해 논의하는 것과는 약간 거리가 멀지 만 감마에 대한이 링크를 시도 할 수 있습니다. en.wikipedia.org/wiki/Gamma_distribution#Parameter_estimation 로그 정규의 경우 로그를 가져옵니다 (가정 모든 데이터는 양수 임) 로그 변환 데이터로 작업합니다. 더 좋은 것은 통계 교과서로 작업해야한다고 생각합니다.
John Johnson

3
원본 포스터와 다른 모든 답변이 구식 히스토그램이나 다소 현대적인 데이터 기반 밀도 추정과 같은 비모수 추정을 사용하는 데 얼마나 만족하는지 오해한다고 생각합니다. 모수 추정치는 분포를 의심 할만한 충분한 이유가있는 경우 유용합니다. 그러나 여기서는 그렇지 않았습니다.
Dirk Eddelbuettel

11

Dirk 는 히스토그램에 밀도 함수를 그리는 방법을 설명했습니다. 그러나 때로는 치우친 정규 분포의 더 강력한 가정을 사용하여 밀도 대신 플롯 할 수 있습니다. sn 패키지를 사용하여 분포의 모수를 추정하고 플로팅 할 수 있습니다 .

> sn.mle(y=c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
$call
sn.mle(y = c(rep(65, times = 5), rep(25, times = 5), rep(35, 
    times = 10), rep(45, times = 4)))

$cp
    mean     s.d. skewness 
41.46228 12.47892  0.99527 

치우침 정규 분포 데이터 그림

이것은 아마도 더 비대칭적인 데이터에서 더 잘 작동 할 것입니다.

또 다른 비대칭 정규 플롯


3

나는 같은 문제가 있었지만 Dirk의 솔루션이 작동하지 않는 것 같습니다. 매번이 경고 메시지를 받고 있었어

"prob" is not a graphical parameter

나는 읽고 ?hist발견했다freq: a logical vector set TRUE by default.

나를 위해 일한 코드는

hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.