Подходящее распределение к заданным значениям частоты в R

У меня есть значения частоты, изменяющиеся со временем (единицы оси x), как показано на рисунке ниже. После некоторой нормализации эти значения можно рассматривать как точки данных функции плотности для некоторого распределения.

Вопрос. Если предположить, что эти частотные точки взяты из распределения Вейбулла T, как я могу сопоставить наилучшую функцию плотности Вейбулла с точками, чтобы вывести из нее параметры распределения T?

sample <- c(7787,3056,2359,1759,1819,1189,1077,1080,985,622,648,518,
            611,1037,727,489,432,371,1125,69,595,624)

plot(1:length(sample), sample, type = "l")
points(1:length(sample), sample)

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

Обновить. Чтобы не быть неправильно понятым, я хотел бы добавить немного больше пояснений. Говоря у меня есть значения частоты, изменяющиеся со временем (x единиц оси), я имею в виду, что у меня есть данные, которые говорят, что у меня есть:

  • 7787 реализаций значения 1
  • 3056 реализаций значения 2
  • 2359 реализаций значения 3 ... и т.д.

Некоторым путем к моей цели (как мне кажется, неправильной) было бы создание набора этих реализаций:

# Loop to simulate values 
set.values <- c()
for(i in 1:length(sample)){
  set.values <<- c(set.values, rep(i, times = sample[i]))
}

hist(set.values)
lines(1:length(sample), sample)
points(1:length(sample), sample)

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

и используйте fitdistr на set.values:

f2 <- fitdistr(set.values, 'weibull')
f2

Почему я считаю это неверным и почему я ищу лучшее решение в R?

  • в подходе подбора распределения, представленном выше, предполагается, что set.values является полным набором моих реализаций из распределения T

  • в моем первоначальном вопросе я знаю точки из первой части кривой плотности - я не знаю ее хвоста и хочу оценить хвост (и вся функция плотности)


person Marta Karas    schedule 14.03.2015    source источник
comment
Я обновил свой ответ гистограммами.   -  person TinaW    schedule 03.05.2015
comment
Знаете ли вы точное значение, где заканчивается первая часть кривой плотности и начинается хвост? Ваш образец заканчивается на значении 22: могу ли я предположить, что хвост начинается на 23?   -  person renato vitolo    schedule 05.05.2015
comment
Боюсь, я не понимаю (я не знаю формального определения хвоста распределения, которое я мог бы здесь использовать). Моя конечная цель - вычислить ожидаемое значение переменной, которая имеет распределение T. Может быть, разумно предположить, что первая часть (часть между 1. и 2. точками на гистограмме выше) является линейной, а последняя часть - вейбулловской (Вейбулл - это предположение, которое я получил от кого-то, кто предоставил мне данные. Я бы не стал Ставлю на это свою жизнь, но я склонен предположить то же самое.)   -  person Marta Karas    schedule 05.05.2015
comment
Вы говорите: в моем первоначальном вопросе я знаю точки из первой части кривой плотности. Что именно вы подразумеваете под первой частью? На каком значении останавливается первая часть? Вы также говорите: я не знаю его хвоста и хочу оценить хвост (и всю функцию плотности). Для этого вам нужно (критерий) выбрать, где начинается хвост.   -  person renato vitolo    schedule 06.05.2015
comment
Я вроде как ответил на него. Каким образом мое решение не то, что вы ищете?   -  person Mike Wise    schedule 10.05.2015
comment
@MikeWise, я согласен с твоим мнением. Я очень рад, что вы приняли участие в этом обсуждении — вы не только предоставили рабочее решение, но и внесли свой вклад, несколько раз поделившись своими мыслями. Спасибо большое! :)   -  person Marta Karas    schedule 10.05.2015
comment
И благодарю вас. На самом деле это был самый забавный вопрос, на который я когда-либо отвечал. Я также участвую в проекте профилактического обслуживания, если вы хотите поделиться мыслями за пределами SO, отправьте мне пинг.   -  person Mike Wise    schedule 10.05.2015


Ответы (3)


Сначала попробуйте со всеми точками

Вторая попытка с отброшенной первой точкойВот более удачная попытка, например, до использования optim для поиска наилучшего значения, ограниченного набор значений в поле (определяется векторами lower и upper в вызове optim). Обратите внимание, что он масштабирует x и y как часть оптимизации в дополнение к параметру формы распределения Вейбулла, поэтому у нас есть 3 параметра для оптимизации.

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

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

library(optimx)
sample <- c(60953,7787,3056,2359,1759,1819,1189,1077,1080,985,622,648,518,
            611,1037,727,489,432,371,1125,69,595,624)
t.sample <- 0:22

s.fit <- sample[3:23]
t.fit <- t.sample[3:23]

wx <- function(param) { 
  res <- param[2]*dweibull(t.fit*param[3],shape=param[1])
  return(res)
} 
minwx <- function(param){
  v <- s.fit-wx(param)
  sqrt(sum(v*v))
}

p0 <- c(1,200,1/20)
paramopt <- optim(p0,minwx,gr=NULL,lower=c(0.1,100,0.01),upper=c(1.1,5000,1))

popt <- paramopt$par
popt
rms <- paramopt$value
tit <- sprintf("Weibull - Shape:%.3f xscale:%.1f  yscale:%.5f rms:%.1f",popt[1],popt[2],popt[3],rms)

plot(t.sample[2:23], sample[2:23], type = "p",col="darkred")
lines(t.fit, wx(popt),col="blue")
title(main=tit)
person Mike Wise    schedule 03.05.2015
comment
Привет @Mike Wise, спасибо за интерес и этот полный пример! Как видите, подогнать кривую таким образом сложно - на мой взгляд, подобранная кривая не подходит, так как она недостаточно изогнута. Я считаю, что это должно быть больше похоже на синюю циркулярку из здесь, не так ли? - person Marta Karas; 03.05.2015
comment
plus1 для полного примера с возможными более общими целями использования - person Marta Karas; 03.05.2015
comment
Да, я думаю, что вы должны использовать внешние знания, чтобы ограничить посадку. Например, есть ли у вас предварительные знания о вероятностях, если частота отказов постоянна, увеличивается или уменьшается. Я полагаю, что это вхождение в область байесовской оценки, и на данный момент мне это недоступно, но я работаю над этим :) - person Mike Wise; 03.05.2015
comment
На этом форуме есть интересные обсуждения настройки Weibull с использованием других инструментов. Но мне нужно время, чтобы их переварить. - person Mike Wise; 03.05.2015
comment
Спасибо, @Mike Wise! Я был бы очень признателен, если бы вы могли упомянуть здесь какие-либо интересные ссылки, если вы найдете что-то. Я очень ценю вашу помощь. - person Marta Karas; 03.05.2015
comment
Сделал еще один выстрел. - person Mike Wise; 03.05.2015
comment
Вау, я только что понял, что я думаю, что только хвост Вейбулла может быть очень хорошим замечанием! Спасибо. Я рассмотрю это и ваше решение в течение нескольких дней. - person Marta Karas; 03.05.2015
comment
@Mike Wise: по какой причине вы установили t.sample ‹- 0:22? Используя t.sample ‹- 1:23 и начиная с t.fit, s.fit с 1:23, я получаю достойную подгонку во всем, включая первую точку. - person renato vitolo; 06.05.2015
comment
Гм, t.sample ‹- 0:22 было тем, что ОП опубликовал в исходной задаче, поэтому я просто использовал это и не менял, поскольку считал это одним из заданных. Теперь я вижу, что OP изменил проблему, и теперь все немного по-другому, масштаб оси t может варьироваться. Мне нужно немного подумать об этом. - person Mike Wise; 06.05.2015
comment
У меня есть еще несколько идей, может успею попробовать их завтра или сегодня вечером. - person Mike Wise; 07.05.2015
comment
Попытался подогнать сразу два Вейбулла, чтобы обработать эти первые две точки, но не смог добиться сходимости. - person Mike Wise; 09.05.2015
comment
Вы можете получить другие хорошие совпадения, немного изменив масштабы x и y. Было бы полезно узнать больше о шкале времени (что было происхождением и т. д.). Если бы это был мой проект, я бы, вероятно, выполнил начальную загрузку этих подгонок, чтобы получить границы и распределения параметров. - person Mike Wise; 09.05.2015

Вы можете напрямую рассчитать параметры максимальной вероятности, как описано здесь.

# Defining the error of the implicit function
k.diff <- function(k, vec){
  x2 <- seq(length(vec))
  abs(k^-1+weighted.mean(log(x2), w = sample)-weighted.mean(log(x2), 
                                                            w = x2^k*sample))
}

# Setting the error to "quite zero", fulfilling the equation
k <- optimize(k.diff, vec=sample, interval=c(0.1,5), tol=10^-7)$min

# Calculate lambda, given k
l <- weighted.mean(seq(length(sample))^k, w = sample)

# Plot
plot(density(rep(seq(length(sample)),sample)))
x <- 1:25
lines(x, dweibull(x, shape=k, scale= l))
person user1965813    schedule 06.05.2015
comment
Это не работает, пока я не запущу свой код. Не знаю, почему. Сообщение об ошибке: k ‹- optimise(k.diff, vec=sample, interval=c(0.1,5), tol=10^-7)$min Ошибка в as.double(w): невозможно выполнить принудительное закрытие типа ' в вектор типа "двойной" - person Mike Wise; 09.05.2015
comment
Я получаю сообщение об ошибке: Ошибка в as.double(w): невозможно принудить тип "закрытие" к вектору типа "двойной" - person Mike Wise; 09.05.2015
comment
Привет @user1965813, спасибо за ответ! Я смог воспроизвести ваш код. Я также воспроизвел код для примера с удаленным первым элементом (так как в обсуждении есть мнение, что первый пункт не подходит к остальным и я склоняюсь к этому мнению), см. здесь. Затем я сравнил формы этих графиков dendisty, и мне кажется, что решение Майка дает более подходящие результаты в этом кейс. Тем не менее, большое спасибо за то, что поделились этим подходом! - person Marta Karas; 10.05.2015

Предполагая, что данные получены из распределения Вейбулла, вы можете получить оценку параметра формы и масштаба следующим образом:

sample <- c(7787,3056,2359,1759,1819,1189,1077,1080,985,622,648,518,
        611,1037,727,489,432,371,1125,69,595,624)
 f<-fitdistr(sample, 'weibull')
 f

Если вы не уверены, распространяется ли Weibull, я бы рекомендовал использовать ks.test. Это проверяет, являются ли ваши данные гипотетическим распределением. Зная ваши знания о характере данных, вы можете протестировать несколько выбранных дистрибутивов и посмотреть, какой из них работает лучше всего.

Для вашего примера это будет выглядеть так:

 ks = ks.test(sample, "pweibull", shape=f$estimate[1], scale=f$estimate[2])
 ks

Значение p незначительно, поэтому вы не отвергаете гипотезу о том, что данные получены из распределения Вейбулла.

Обновление: гистограммы Вейбулла или экспоненты хорошо соответствуют вашим данным. Я думаю, что экспоненциальное распределение дает вам лучшее соответствие. Распределение Парето — еще один вариант.

f<-fitdistr(sample, 'weibull')
z<-rweibull(10000, shape= f$estimate[1],scale= f$estimate[2])
hist(z)

f<-fitdistr(sample, 'exponential')
z = rexp(10000, f$estimate[1]) 
hist(z)
person TinaW    schedule 03.05.2015
comment
Хм, боюсь, я ошибся, признав этот ответ правильным. Функция fitdistr обрабатывает значения (здесь: значения из вектора sample) как реализации из распределения T (другими словами: точки, полученные из распределения T), а не как точки данных кривой функции плотности для некоторого дистрибутива. Обратите внимание, что когда я использую оценочные параметры shape и scale для рисования точек из оценочной T и затем строю плотность для этих точек (что не относится к моему вопросу), я заканчиваю с плотностью, подобной этой, где значения по оси X всегда неверны. - person Marta Karas; 03.05.2015
comment
Что вы подразумеваете под: точками данных кривой функции плотности для некоторого распределения? В своем вопросе вы сказали, что думаете, что это Вейбулл. PDF-файл для Вейбулла с оценочными параметрами. Если вы хотите сравнить его с вашим графиком, вам нужно сравнить его с историей (выборкой). Ваш график выше не похож на PDF. - person TinaW; 03.05.2015
comment
Привет @TinaW, любезно отсылаю вас к обновлению, которое я только что добавил к моему вопросу. - person Marta Karas; 03.05.2015
comment
Что заставляет вас думать, что это распространение Weibull? - person TinaW; 03.05.2015
comment
Я думаю только хвост. - person Mike Wise; 03.05.2015
comment
Можете ли вы опубликовать дополнительную информацию о: 1) непреобразованном ряду (я понимаю, что образец, который вы разместили, представляет собой преобразованные данные после неизвестного распределения. Можете ли вы опубликовать непреобразованный, который соответствует Вейбуллу); 2) Подробная информация о преобразовании, которое вы выполнили для получения образца, т.е. что означает некоторую нормализацию. - person TinaW; 04.05.2015
comment
Привет @TinaW, это исходные данные, которые я получил (данные о количестве пользователей, которые продолжали использовать службу в течение определенного количества единиц времени (ось x)). Под некоторой нормализацией я имел в виду только то, что после нормализации значений (количества пользователей) мы получили бы какие-то веса, которые могут каким-то образом соответствовать значениям функции плотности. Это похоже на то, как вы строите гистограмму с использованием функции hist в R, и вы можете выбирать между параметрами freq=TRUE или probability=TRUE. Здесь на графиках в моем исходном вопросе данные соответствуют типу freq=TRUE и... - person Marta Karas; 04.05.2015
comment
... и некоторая нормализация сделает значения probability=TRUE природы. Впрочем, я не думаю, что это какая-то критическая проблема здесь :) - person Marta Karas; 04.05.2015