2017-09-07 9 views
1

私は変換したいlognormalデータを持っています。ここでは正確に対数正規分布ではないデータで再現可能な例であるが、それは十分に近いです:データに正規分布をプロットする

# create some lognormal data 
dat <- data.frame(x = c(runif(1000, 0, 1), runif(300, 1, 100), runif(100,100,1000))) 

私はlog10することにより、これらのデータを変換し、MASS::fitdistrとそれらへの正規分布に適合することができます。

# fit normal distribution to log-transformed values 
library(MASS) 
fit <- fitdistr(log10(dat$x), densfun = "normal") 
fit$estimate # mean and SD of the normal distribution 

ここでは、データとその上の分布をプロットする必要があります。私はlog10でデータを変換し、stat_functionで正規分布をプロットしますが、データに適合しません。

# plot data and distribution 
ggplot(data = dat) + 
    geom_histogram(mapping = aes(x = log10(x))) + 
    stat_function(fun = dnorm, args = list(mean = fit$estimate[1], sd = fit$estimate[2], log = TRUE)) 

enter image description here

任意のポインタと同様に、検証は私が正しくこれについてつもりならば、非常に参考になります。

最後に、x軸を10,100,1000などの単位で表示するにはscale_x_log10()を使用しますか? x軸をフォーマットする簡単な方法は何ですか?

+0

ログ(一様分布)これは私が探していたまさにです_not_対数正規 –

答えて

2

あなたは同じグラフ上にあなたがここに美的y=..density..
を使用して濃度ヒストグラムをプロットする必要がヒストグラムと密度分布を描きたいの例です。物事を明確にするために、私は対数正規分布からデータを生成しました。

set.seed(123) 
# Generate data from a log-normal distribution 
dat <- data.frame(x=rlnorm(10000)) 

# Fit normal distribution to log-transformed values 
library(MASS) 
fit <- fitdistr(log10(dat$x), densfun = "normal") 

# Plot density histogram and fitted distribution 
ggplot(data = dat) + 
    geom_histogram(mapping = aes(x = log10(x), y = ..density..), col="white") + 
    stat_function(fun = dnorm, 
     args = list(mean = fit$estimate[1], sd = fit$estimate[2], log = F), 
     color="red", lwd=1) 

enter image description here

+0

です。ありがとう@マルコ!もう1つ(おそらくは素早い)質問ですが、この例ではx軸の書式を設定するために何をお勧めしますか?あなたは 'scale_x_log10() 'や' scale_x_continuous()'をbreaksとlabelの引数を1、10、100、1000 ...で使用しますか? –

+0

@ RichPauloo私の意見では、上記のプロットのx軸は大丈夫です。 x軸にはxのログ値があり、したがって1は10を意味し、2は100を意味します。 –

+0

@RichPaulooそれ以外の場合は、 'scale_x_continuous'を使用できます。私の意見では、scale_x_log10()を使用しないでください。 –

関連する問題