密度曲線を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

どういう意味か
わかり

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 2013年

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)で上記を試す)、次のようなゆがんだ分布を当てはめることができます。ガンマまたは対数正規(対数正規は、対数を取り、法線を合わせる、btwと同じです)。
ジョンジョンソン

2
ただし、それでも、最初に分布のパラメーターを推定する必要があります。
Dirk Eddelbuettel、2009

私たちは、より理論的な統計になっているので、これは、少し遠く単にRを議論から取得しますが、あなたはガンマのために、このリンクを試みる場合があります:en.wikipedia.org/wiki/Gamma_distribution#Parameter_estimation 対数正規の場合、単にログを取る(仮定しますすべてのデータはポジティブです)、ログ変換されたデータを操作します。もっとおかしな人には、統計の教科書を使わなければならないでしょう。
ジョンジョンソン

3
元のポスターと他のすべての回答の両方が、ノンパラメトリックな見積もりを使用するのにかなり満足していると思いますか?古い学校のヒストグラムや、やや最新のデータ駆動型の密度見積もりなどです。分布を疑う十分な理由がある場合は、パラメトリック推定は最適です。しかし、ここではそうではありませんでした。
Dirk Eddelbuettel、2009

11

ダークは、密度関数をヒストグラムにプロットする方法を説明しました。しかし、歪んだ正規分布のより強い仮定を使用して、密度の代わりにそれをプロットしたい場合があります。分布のパラメーターを推定し、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.