我想绘制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)
给出了以下图片:
似乎是正确的,对吧?
答案 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")