2

年齢の日数のリストがあり、密度プロットに年数で表示したいと考えています。

私はこれを2つの方法で行いました。x軸のラベルを年に変更し、データを365で除算することです。これらの方法では、異なる密度推定値が得られます。

df <- data.frame(id = 1:80000, age = rnorm(80000, 46, 5) * 365)

最初のプロットは、以下を使用して生成されます。

breaks <- seq(from = min(df$age), to = max(df$age), by = 10*365)
ggplot(data = df, aes(x = age)) + 
    geom_density(aes(y = ..density..)) + 
    scale_x_continuous(breaks= breaks, labels = floor(breaks/365))

ここに画像の説明を入力してください y軸に表示される密度の範囲は0〜0.0002です。

ただし、これを行う場合(上記のようにxラベルを変更するだけでなく、年齢を365で割って年を取得します):

ggplot(data = df, aes(x = age/365)) + 
    geom_density(aes(y = ..density..))

プロットは同じように見えますが、密度の範囲は0〜0.08です。何が起こっているのか理解するのに苦労しています。2つのプロット間で密度が異なるのはなぜですか。

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

4

2 に答える 2

4

2つのプロットでは密度が異なります。これは、ある場合には水平方向の365倍の単位があるため、確率密度関数(これらの曲線の下の領域)を考えると、垂直方向の単位は他のプロットの1/365である必要があります。合計して1にする必要があります。

これは、密度曲線よりもビンの観点から考える方が簡単です。365個のビンを置き換える1つのビンがある場合、1つのビンに着陸する確率は、個々のビンに着陸する平均確率よりもはるかに高くなります。

提供する特定のサンプルデータについては、両方の関数のピークを調べることで、垂直単位間の変換を確認できます。

> max(density(df$age)$y) # max of density in days, more horizontal units
[1] 0.0002178977
> df$ageinyears <- df$age/365 # create an age-in-years variable
> max(density(df$ageinyears)$y) # max density in years, fewer horizontals
[1] 0.07953267
> max(density(df$age)$y)*365 
[1] 0.07953267

これがプロットの問題である(そしておそらくあなたの質問の主な目的である)実際的な理由は、ggplotの密度を推定している関数が親aes()からx引数を継承していることです。したがって、使用しているカスタムx軸については何も知りません。最初のプロットでx軸を変更するだけでなく、継承されたx値を使用しないようにgeom_densityに明示的に指示することができます。

ggplot(data = df, aes(x = age)) + 
    geom_density(aes(x = age/365, y = ..density..))
于 2012-11-20T13:53:51.910 に答える
2

最善のアドバイスは、y軸の目盛りラベルを無視することです。これらは密度プロットの解釈にはまったく役立ちません。これまで見てきたように、役立つよりも混乱する可能性が高くなります。

私の好みは、密度プロット、ヒストグラム、および同様のプロットのデフォルトの動作で、y軸の目盛りにラベルを付けないことです。これらは一般に何も意味せず、グラフの重要な部分から注意をそらす傾向があり、多くの場合、錯乱。意味のある値にスケーリングされた場合でも、プロットの主な目的には役立たず、混乱を引き起こす可能性があります(ヒストグラムのビンの数を変更したところ、y-tickラベルが大きく異なり、パニックになりました。パニック!)。残念ながら、それらをプロットすることには非常に多くの慣性があるため、私だけでこれを変更することはほとんどありません。

于 2012-11-20T19:16:00.987 に答える