1

为了显示增加右偏度的效果,我想创建两个重叠图,其中一个分布比另一个分布更右偏。

所以我做了如下的事情

library(SuppDists)

tmp1fun <- function(m1=0,m2=1,m3=-0.2,m4=3.7,n=20000) {
    parms <- JohnsonFit(c(m1,m2,m3,m4), 'use')
    rJohnson(n,parms) }

data1.dens <- rbind(data.frame(var1=rep('now',50000),y=tmp1fun(m3=-0.2,n=50000))
    ,data.frame(var1=rep('hist',50000),y=tmp1fun(m3=0.2,n=50000)))

library(ggplot2)
ggplot(data1.dens, aes(y, fill = var1))+
geom_density(alpha = 0.5) + coord_cartesian(xlim=c(-4, 4))

但是它看起来不正确,它看起来更像是分布的平均值相对于另一个移动了。另外,我希望密度图看起来更平滑一些。

所以我的问题有两个部分 1. 我应该使用什么分布和什么参数,以便一个分布看起来与另一个分布相似,但更偏向正确?2. 制作这个情节的最佳图形工具是什么?如果可能的话,我想要一个实心图表,而不仅仅是一条线,也许还有更高的带宽和更平滑的。

感谢您的任何提示或建议。

4

1 回答 1

3

最好使用实际概率密度函数来显示理论密度,而不仅仅是平滑的随机变量。特别是当分布是长尾时,因为可能需要大量随机变量才能准确地表征尾部。概率密度函数也将(显然)导致更平滑的密度。

使用密度函数应该可以清楚地看出哪个参数做了什么。在这里我改变m1了,这导致了你要求的形状。

这是一个与您的示例相似的选项,使用概率密度函数 和geom_polygon()

library(SuppDists)
library(ggplot2)
# function to calculate density along a grid
JohnsonDensity = function(m1 = 0, m2 = 1, m3 = -0.2, m4 = 3.7, n = 10000) {
    parms <- JohnsonFit(c(m1, m2, m3, m4))
    J_quantiles = na.omit(qJohnson(seq(0, 1, length.out = n+2), parms))
    J_pdf = dJohnson(J_quantiles, parms)
    return( data.frame(pdf = c(J_pdf, 0, 0), x = c(J_quantiles, J_quantiles[length(J_quantiles)], J_quantiles[1]) ) )
}

# values of the pdf along the grid for two distributions
data_density = rbind(data.frame(var1 = "now", JohnsonDensity() ), data.frame(var1 = "hist", JohnsonDensity(m1 = 0.2)) )

ggplot(data_density, aes(x = x, y = pdf, color = var1, fill = var1)) + geom_polygon(alpha = 0.5)

在这个例子中,密度的平滑度由 控制n,现在是计算密度的网格点的数量。

于 2013-09-16T00:56:05.800 回答