Как указано в заголовке, у меня проблема масштабирования с функцией fitdist в R (пакет fitdistrplus).

Обратите внимание на следующий код:

# Initialize arrays for storing result
fit_store_scale <- rep(NA, 3)
fit_store_shape <- rep(NA, 3)

# load data
data1 <- c(7.616593e-05, 5.313253e-05, 1.604328e-04, 6.482365e-05,
           4.217499e-05, 6.759114e-05, 3.531301e-05, 1.934228e-05,
           6.263665e-05, 8.796205e-06)
data2 <- c(7.616593e-06, 5.313253e-06, 1.604328e-05, 6.482365e-06,
           4.217499e-06, 6.759114e-06, 3.531301e-06, 1.934228e-06,
           6.263665e-06, 8.796205e-07)
data3 <- c(7.616593e-07, 5.313253e-07, 1.604328e-06, 6.482365e-07,
           4.217499e-07, 6.759114e-07, 3.531301e-07, 1.934228e-07,
           6.263665e-07, 8.796205e-08)
# form data frame
data <- data.frame(data1, data2, data3)

# set scaling factor
scaling <- 1        #works without warnings and errors at:    
                    #10000 (data1), 100000 (data2) or
                    #1000000 (data3)

# store scale and shape parameter of data1, data2 and data3 in Array
for(i in 1:3)
{
    fit.w1 <- fitdist(data[[i]]*scaling,"weibull", method = "mle")
    fit_store_scale[i] <- fit.w1$estimate[[2]]*1/scaling
    #1/scaling is needed for correcting scale parameter
    fit_store_shape[i] <- fit.w1$estimate[[1]]
}

У меня есть три вектора данных, которые хранятся во фрейме данных. Теперь я хочу использовать функцию fitdist для оценки параметра масштаба и формы отдельно для каждого столбца данных (data1, data2 и data3) и, наконец, сохранить их в { {X4}} и fit_store_shape соответственно.

Проблема здесь в том, что функция fitdist не работает без соответствующего коэффициента масштабирования и что для data1, data2 и data3 требуются разные коэффициенты. Я ищу решение для автоматического определения оптимального коэффициента масштабирования для каждого столбца данных и, таким образом, чтобы функция fitdist работала в конечном итоге.

2
titus24 27 Окт 2015 в 17:44

2 ответа

Лучший ответ

Если вы не совсем привязаны к fitdist, вы можете использовать что-то более надежное - следующее соответствует Weibull с параметрами в логарифмической шкале и использует подход Нелдера-Мида, а не градиентный подход. . Похоже, у него нет никаких проблем с сопоставлением этих данных.

dd <- data.frame(data1,data2,data3)
library("bbmle")
fx <- function(x) {
    m1 <- mle2(y~dweibull(shape=exp(logshape),scale=exp(logscale)),
           data=data.frame(y=x),start=list(logshape=0,logscale=0),
           method="Nelder-Mead")
    exp(coef(m1))
}
t(sapply(dd,fx))  ## not quite the output format you asked for,
                  ##  but easy enough to convert.
##       logshape     logscale
## data1 1.565941 6.589057e-05
## data2 1.565941 6.589054e-06
## data3 1.565941 6.589055e-07

Этот подход должен работать достаточно хорошо для любого дистрибутива, для которого у вас есть функция стандартного распределения (d*()).

2
Ben Bolker 27 Окт 2015 в 15:45

Один из способов решить эту проблему - продолжать попытки подогнать распределение путем масштабирования на 10^j:

for(i in 1:3)
{
  j <- 0
  while(inherits(try(fitdist(data[[i]] * 10^j, "weibull", method = "mle"), silent = TRUE), "try-error"))
  {
    j <- j + 1
  }
  cat("\nFor data[[", i, "]], used j =", j, "\n\n")
  fit.w1 <- fitdist(data[[i]] * 10^j, "weibull", method = "mle")
  fit_store_scale[i] <- fit.w1$estimate[[2]] * 1/10^j
  #1/scaling is needed for correcting scale parameter
  fit_store_shape[i] <- fit.w1$estimate[[1]]
}


# For data[[ 1 ]], used j = 2 
# For data[[ 2 ]], used j = 3 
# For data[[ 3 ]], used j = 4 

# > fit_store_scale
# [1] 6.590503e-05 6.590503e-06 6.590503e-07
# > fit_store_shape
# [1] 1.56613 1.56613 1.56613

То есть для data[[1]] мы успешно использовали j = 2 (масштабирование на 10^2 == 100), для data[[2]] мы использовали j = 3 == 10^3 == 1,000, а для {{X5} } мы использовали j = 4 == 10^4 == 10,000.

В конце концов, это найдет наименьшую степень 10 для масштабирования данных и достижения соответствия. См. Пример #14 под ?fitdist для вариантов этого подхода / темы.

1
JasonAizkalns 27 Окт 2015 в 15:47