Гистограмма, ядро ​​плотности и нормальное распределение

Я хочу построить гистограмму, плотность (ядро Гаусса) и соответствующее нормальное распределение простых потерь компании 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

or

 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. Значит, в этом случае не происходит экстремальных потерь, а реализуется экстремальная выгода? Это правильно?

В чем моя ошибка, я ее не вижу?

Снимок экрана:

Вы можете найти данные здесь

Это данные 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)

что дает следующую картину:

введите описание изображения здесь

кажется правильным, не так ли?


person Stat Tistician    schedule 14.03.2013    source источник
comment
Должно ли стандартное отклонение для нормальной кривой действительно быть равным среднему значению данных? Какое значение? Кроме того, откуда мы берем эти данные? Мы не можем дать правильный ответ, не имея возможности работать с теми же данными, с которыми работаете вы.   -  person ndoogan    schedule 14.03.2013
comment
@ndoogan, спасибо за подсказку!   -  person Stat Tistician    schedule 14.03.2013


Ответы (2)


Справка R говорит:

логичный; если ИСТИНА, гистограмма представляет собой частоту, составляющую подсчета результата; если ЛОЖНО, отображаются плотности вероятности, плотность компонентов.

Когда атрибут freq равен TRUE, отображается количество раз, когда значения появляются в данных. Если у вас есть вектор с 400-кратным значением 1 и 300-кратным значением 0, высота полос будет 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")

or

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

ToBeFilled - это соответственно границы интервала, на котором вы хотите построить график.

person Pop    schedule 14.03.2013
comment
Хорошо, еще один вопрос: теперь у меня на оси Y значения 25 или 30, я использую freq = F Как я могу интерпретировать это значение? Это столбец, который является максимальным, приблизительный убыток составляет около 0,0. Итак, какая вероятность этого бара будет? Я ведь должен знать ширину этой полосы? Итак, 30 $ * ширина $ - это вероятность возникновения убытков около 0,0? Как я могу получить точный диапазон этого бара? Например. от -0,005 до 0,005? - person Stat Tistician; 14.03.2013
comment
а он работает с кривой? curve (dnorm (x, mean = mean (alvsloss), sd = sd (alvsloss)), add = TRUE, col = blue, lwd = 2) работает или нет? - person Stat Tistician; 14.03.2013
comment
строки (dnorm (x, mean = mean (alvsloss, na.rm = TRUE), sd = sd (alvsloss, na.rm = TRUE)), col = blue, lty = dotted) не работает: объект x не найден - person Stat Tistician; 14.03.2013
comment
Вы должны поставить квантили вместо x. Например, seq(0,1,length.out=100). curve может работать, но не так, как вы написали в своем вопросе: он должен применяться к функции. Если вы получите результаты своей histкоманды, набрав a <- hist(...), вы можете получить всю необходимую информацию о гистограмме: a$breaks и a$density, например, которые позволяют вам вычислять вероятности. - person Pop; 14.03.2013
comment
Я отредактировал свой ответ. Как я помещаю этот код в R, так как я не получаю сообщения об ошибке и получаю красивую картинку? - person Stat Tistician; 14.03.2013

Я не знаю, где взять данные, с которыми вы работаете, но попробуйте установить стандартное отклонение на графике dnorm равным стандартному отклонению ваших данных ...

curve(dnorm(x, mean = mean(alvsloss), sd = sd(alvsloss)), add=TRUE, col="blue", lty="dotted")
person ndoogan    schedule 14.03.2013
comment
Благодарность! Я могу принять только один ответ как ответ, но это мне помогло! - person Stat Tistician; 14.03.2013
comment
@StatTistician Если вы хотите поблагодарить, вы можете проголосовать за ответ. Кроме того, добро пожаловать. - person ndoogan; 14.03.2013