100

曲線をヒストグラムに適合させる関数がRにありますか?

次のヒストグラムがあったとしましょう

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

正常に見えますが、歪んでいます。このヒストグラムをラップするために歪んだ正規曲線をフィットさせたいです。

この質問はかなり基本的なものですが、インターネットでRの答えを見つけることができないようです。

4

7 に答える 7

166

私があなたの質問を正しく理解しているなら、あなたはおそらくヒストグラムと一緒に密度推定が必要です:

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) 

それが生成するグラフと一緒に:

ここに画像の説明を入力してください

于 2009-09-30T12:02:42.717 に答える
32

そのようなことは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()
于 2009-09-30T18:30:09.580 に答える
30

これが私がそれをする方法です:

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

ボーナスエクササイズは、ggplot2パッケージでこれを行うことです...

于 2009-09-30T13:32:39.223 に答える
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 

スキュー-正規分布データプロット

これはおそらく、よりスキュー正規分布のデータでより適切に機能します。

別のスキュー正規プロット

于 2012-02-13T07:10:03.017 に答える
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)
于 2014-01-21T14:34:05.000 に答える
0

これはカーネル密度推定です。このリンクをクリックして、概念とそのパラメーターの優れた図を確認してください。

曲線の形状は、主に2つの要素に依存します。1)すべてのデータを入力して重み付けすることにより、x座標のすべての値についてy座標の点を推定するカーネル(通常はEpanechnikovまたはGaussian )。そしてそれは対称的であり、通常は1つに統合される正の関数です。2)帯域幅が大きいほど、曲線は滑らかになり、曲線は小さくなります。

さまざまな要件については、さまざまなパッケージを適用する必要があります。このドキュメントを参照してください:Rでの密度推定また、多変量変数の場合は、多変量カーネル密度推定に目を向けることができます。

于 2021-05-10T13:43:38.120 に答える
0

一部のコメントでは、y軸が密度ではなくカウントとして残るように、密度推定線をヒストグラムのピークにスケーリングするように要求されました。これを実現するために、ビンの最大の高さを自動的にプルし、それに応じて密度関数のy次元をスケーリングする小さな関数を作成しました。

hist_dens <- function(x, breaks = "Scott", main = "title", xlab = "x", ylab = "count") {
  
  dens <- density(x, na.rm = T)
  
  raw_hist <- hist(x, breaks = breaks, plot = F)
  
  scale <- max(raw_hist$counts)/max(raw_hist$density)
  
  hist(x, breaks = breaks, prob = F, main = main, xlab = xlab, ylab = ylab)
  
  lines(list(x = dens$x, y = scale * dens$y), col = "red", lwd = 2)
  
}

hist_dens(rweibull(1000, 2))

reprexパッケージ(v2.0.1)によって2021-12-19に作成されました

于 2021-12-14T05:07:37.407 に答える