1

我想绘制 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

未绘制正态分布曲线。

第二个是一般性的问题:如果我省略了正态分布,那么我只有直方图和密度。比我可以通过命令在频率真假之间改变

 freq=T

或者

 freq=F

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

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

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

截屏:

你可以在这里找到数据

这是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)

这给出了以下图片:

在此处输入图像描述

似乎是正确的,对吧?

4

2 回答 2

3

R帮助说:

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

freq属性为TRUE时,将绘制值在数据中出现的次数。如果您有一个向量,其值为 1 的 400 倍,值为 0 的 300 倍,则条形的高度在 时为 400 和 300,在 时freq=TRUE为 4/7 和 3/7 freq=FALSE

对于你问题的第二部分,如果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分别是您要绘制的区间的边界。

于 2013-03-14T12:17:06.813 回答
1

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

curve(dnorm(x, mean = mean(alvsloss), sd = sd(alvsloss)), add=TRUE, col="blue", lty="dotted")
于 2013-03-14T12:13:03.600 回答