R: Как построить распределение gumbel, используя функцию ggplot2 stat_function

Пожалуйста, потерпите меня, если это довольно незначительно, и не стесняйтесь задавать вопросы, если я что-то пропустил...

Я пытаюсь сделать примерно 50-летний расчет экстремального ветра на основе следующей ссылки

http://www.wasp.dk/Products/weng/ExtremeWinds.htm

Кажется, они используют распределение gumbel, поэтому я использовал функцию gumbel в пакете "evir" для подгонки распределения к данным, а функцию dgumbel в пакете "evd" в качестве функции построения графиков.

package("evd")
package("evir")

speeds2 <- data.frame(speed=sample(10:50,1000,rep=TRUE))
gumbel(speeds2$speed)

Затем я попытался построить это с помощью stat_function в ggplot2, вот так (за исключением того, что сейчас я ввел фиктивные значения для loc и scale.

library(ggplot2)
ggplot(data=speeds2, aes(x=speed)) + 
  stat_function(fun=dgumbel, args=list(loc=1, scale=0.5))

Я получаю следующую ошибку:

Error in dgev(x, loc = loc, scale = scale, shape = 0, log = log) : 
  unused argument(s) (loc = loc, scale = scale, shape = 0, log = log)

Я не уверен, правильно ли я делаю это. Любые указатели будут высоко оценены.

3 ответа

Решение

Ранее сессия показала, что оценки параметров от звонка Гамбеля были около 24 и 11.

library(evd)
library(ggplot2)
 speeds2 <- data.frame(speed=sample(10:50,1000,rep=TRUE))
 ggplot(data=speeds2, aes(x=speed), geom="density") + 
   stat_function(fun=dgumbel, args=list(loc=24, scale=11))

Если вы использовали только параметры 1 и 0,5, вы получили прямую плоскую линию. Только загрузка evd предотвращает конфликты с функциями, связанными с dgumbel в evir, Когда вы загружаете evir второе вы получаете:

> speeds2 <- data.frame(speed=sample(10:50,1000,rep=TRUE))
> ggplot(data=speeds2, aes(x=speed), geom="density") + 
+   stat_function(fun=dgumbel, args=list(loc=24, scale=11))
Error in dgev(x, loc = loc, scale = scale, shape = 0, log = log) : 
  unused argument(s) (loc = loc, scale = scale, shape = 0, log = log)

Демонстрация, как позвонить dgumbel функция в определенном (лучше себя ведет) пакете:

library(VGAM)
ggplot(data = speeds2, aes(x = speed)) + 
   stat_function(fun = VGAM::dgumbel, args = list(location = 24, scale = 11))

Я думаю, что предложение Рамната добавить эмпирическую "плотность" хорошо, но я предпочитаю использовать geom_histogram:

ggplot(data=speeds2, aes(x=speed)) + geom_histogram(aes(y = ..density..) , binwidth=5 ) + 
                            stat_function(fun=dgumbel, args=list(loc=24, scale=11))

Вот общая функция, которую я написал, чтобы упростить построение данных с подогнанной и эмпирической плотностями.

# FUNCTION TO DRAW HISTOGRAM OF DATA WITH EMPIRICAL AND FITTED DENSITITES
# data  = values to be fitted
# func  = name of function to fit (e.g., 'norm', 'gumbel' etc.)
# start = named list of parameters to pass to fitting function 
hist_with_density = function(data, func, start = NULL){
    # load libraries
    library(VGAM); library(fitdistrplus); library(ggplot2)

    # fit density to data
    fit   = fitdist(data, func, start = start)
    args  = as.list(fit$estimate)
    dfunc = match.fun(paste('d', func, sep = ''))

    # plot histogram, empirical and fitted densities
    p0 = qplot(data, geom = 'blank') +
       geom_line(aes(y = ..density..,colour = 'Empirical'),stat = 'density') +
       stat_function(fun = dfunc, args = args, aes(colour = func))  +
       geom_histogram(aes(y = ..density..), alpha = 0.4) +
       scale_colour_manual(name = '', values = c('red', 'blue')) + 
       opts(legend.position = 'top', legend.direction = 'horizontal')
    return(p0)  
}

Вот два примера того, как вы бы это использовали. Пример 1: Fit a Gumbel

data1 = sample(10:50,1000,rep=TRUE)
(hist_with_density(data1, 'gumbel', start = list(location = 0, scale = 1)))

Пример 2: подгонка нормального распределения

data2 = rnorm(1000, 2, 1)
(hist_with_density(data2, 'norm'))

С небольшой модификацией вашего кода (добавив geom) он отлично работает для меня.

library(evd)
speeds2 <- data.frame(speed = sample(10:50, 1000, rep = TRUE))

ggplot(data = speeds2, aes(x = speed)) + 
  stat_function(fun = dgumbel, args = list(loc = 1, scale = 0.5)) +
  geom_histogram()
Другие вопросы по тегам