直方图,密度核和正态分布

时间:2013-03-14 12:02:26

标签: r return histogram curve-fitting kernel-density

我想绘制Allianz SE公司简单损失的直方图,密度(高斯核)和拟合的相应正态分布。 (这意味着,简单的损失减去简单的回报)

我有以下代码:

hist(alvsloss,breaks = 100, freq=F,main="Histogramm,
 density curve (gaussian kernel) of Allianz simple losses ",xlab="loss in percent",ylab="density")
lines(density(alvsloss), col="red", lwd=2)
curve(dnorm(x, mean = mean(alvsloss), sd = mean(alvsloss)), add=TRUE, col="blue", lty="dotted")

现在我遇到了第一个问题:

The fitted normal distribution is not drawn, I get the (german) error message:

In dnorm(x, mean = mean(alvsloss), sd = mean(alvsloss)) :
  NaNs wurden erzeugt

未绘制正态分布曲线。

第二个问题一般是: 如果我省略正态分布,那么我只有直方图和密度。我可以通过命令

在频率true和false之间切换
 freq=T

 freq=F

我附上了两张图片的截图(我必须上传它,因为我没有至少10个声誉)。我不明白它们,如果我有freq = T这意味着,我在y轴上有密度值。所以应该有0.0012或0.1之类的值,但不是300或400的值,密度应该是相对值?内核也没有任何匹配,显然是错的?如果我有freq = F我得到了正确的图片。现在我有绝对值,所以例如有30例我的回报率约为0.0(中高峰值),对吗?现在密度确实适合,但我本以为它不适合这种情况,因为我认为它是在freq = T值,所以它应该是另一种方式,在这张图片中它应该是错误的?

如果有答案,我会有进一步的问题: 我不喜欢x轴,我怎样才能有更详细的缩放? 如果说以下是正确的:右边的尾部从0.5到0.1比左边的尾部重,所以在这个区域我们有更高的损失概率而不是增益?而极值仅出现在左侧:-0.2的值,甚至约为-0.4的值。这种情况下的极端损失没有发生,而实现了极端的收益?这是对的吗?

我的错误是什么,我看不到它?

截图:

您可以找到数据here

这是alvsloss数据

完整的解决方案是:

hist(alvsloss,breaks = 100, freq=F,main="Histogramm, density curve (gaussian kernel) of Allianz simple losses ",xlab="loss in percent",ylab="density")
lines(density(alvsloss), col="red", lwd=2) 
curve(dnorm(x, mean = mean(alvsloss), sd = sd(alvsloss)), add=TRUE, col="blue",lwd=2)

给出了以下图片:

enter image description here

似乎是正确的,对吧?

2 个答案:

答案 0 :(得分:3)

R帮助说:

  

逻辑;如果为TRUE,则直方图图形是频率的表示,结果的计数分量;如果为FALSE,则绘制概率密度,组分密度

freq属性为TRUE时,会绘制值在数据中显示的次数。如果你的矢量值是值1的400倍和300倍的值,那么当freq=TRUE时条形的高度为400和300,而freq=FALSE时条形的高度为4/7和3/7。

对于问题的第二部分,如果向量中有NA个值,则必须使用以下公式计算平均值:

mean(...,na.rm=TRUE)

此外,正如ndoogan所说,我认为您的代码中存在拼写错误。试试这个:

dnorm(x, mean = mean(alvsloss,na.rm=TRUE), sd = sd(alvsloss,na.rm=TRUE))

最后,您无法使用curve绘制矢量。它仅适用于功能。所以你可以尝试:

lines(dnorm(x, mean = mean(alvsloss,na.rm=TRUE), sd = sd(alvsloss,na.rm=TRUE)), col="blue", lty="dotted")

curve(dnorm,from=ToBeFilled,to=ToBeFilled,col="blue", lty="dotted",mean = mean(alvsloss,na.rm=TRUE), sd = sd(alvsloss,na.rm=TRUE)))

ToBeFilled分别是您要绘制的区间的边界。

答案 1 :(得分:1)

我不知道从哪里获取您正在使用的数据,但请尝试将dnorm图中的标准偏差设置为数据的标准差...

curve(dnorm(x, mean = mean(alvsloss), sd = sd(alvsloss)), add=TRUE, col="blue", lty="dotted")