簡體   English   中英

如何在ggplot2中使不同大小的密度具有相同的平滑度?

[英]How do I make densities with different sizes have the same smoothness in ggplot2?

我有一個數據集,其中包含一個要顯示其密度的連續變量和一個我想用於拆分密度的分組變量。 當組的大小相似時,密度圖很好:

library(ggplot2)
data("lalonde", package = "cobalt")
ggplot(lalonde, aes(x = educ, fill = factor(treat))) + 
   geom_density(alpha = .5)

在此處輸入圖片說明

現在,假設我的組的大小不同,但是每個組中每個變量的相對頻率相同。 在下面的示例中,我簡單地多次復制了一個組的行,而另一個組則保持原樣。

bigll <- do.call("rbind", c(list(lalonde), replicate(100, 
             lalonde[lalonde$treat == 0,], simplify = FALSE)))
ggplot(bigll, aes(x = educ, fill = factor(treat))) + 
       geom_density(alpha = .5)

在此處輸入圖片說明

看起來不那么平滑。 有沒有一種方法可以將平滑度參數按組調整為,以便第二個圖看起來更像第一個圖? 也就是說,是否可以將平滑度參數更改為最低的公分母,以便可以更輕松地在視覺上比較密度?

在@Carlos和其他人的幫助下,我找到了想要的東西。 誠然,密度的平滑度通常應反倒卡洛斯(Carlos)提到的樣本大小,但在我的情況下,我想要的是使兩個密度的帶寬相同。 特別是,我希望他們成為較小的團體的成員。 ggplot2中的默認帶寬為bw.nrd0 ; 我可以在較小的組上使用它,然后將其設置為繪圖的全局帶寬。

bw <- bw.nrd0(bigll$educ[bigll$treat == 1])
ggplot(bigll, aes(x = educ, fill = factor(treat))) + 
       geom_density(alpha = .5, bw = bw)

在此處輸入圖片說明

這無疑掩蓋了更大版本中的一些細節,但是就我的目的而言,這已經足夠了。

“平滑度”不是參數,是估計帶寬的結果。 您可以使用adjust通過乘數更改帶寬,從而增加兩個組的平滑度:

ggplot(bigll, aes(x = educ, fill = factor(treat))) + 
  geom_density(alpha = .5, adjust = 2)

在此處輸入圖片說明

按照這種邏輯,您可以分別繪制每個組,並為每個組應用不同的乘數:

ggplot() + 
  geom_density(
    aes(x = educ),
    data = subset(bigll, treat == 0),
    fill = '#EB675F', alpha = .5,
    adjust = 3) +
  geom_density(
    aes(x = educ),
    data = subset(bigll, treat == 1),
    fill = '#35C1C4', alpha = .5,
    adjust = 1.5)

在此處輸入圖片說明

這是一個簡單的解決方案。 查看此帖子以獲取有關如何使用更好的函數計算每個組的值的建議: 了解ggplot2中的帶寬平滑

但是在分析數據時,請務必謹慎。 當您將其中一組乘以一個較大的粗糙度時,可以正確反映所做的更改。 由(2,4,6)形成的一組數據與(2,2,2,2,4,4,4,4,4,6,6,6,6)不同。 在第一種情況下,很有可能會有未采樣的中間值。 在第二個中,數據很有可能會間隔出現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM