Вопрос или проблема
Я хочу применить некоторые байесовские методы к эмпирической функции накопленной плотности, которую генерирует мой код на R:
rr<-ecdf(answers)
Так что, если я сгенерирую предварительную ЭКП (назовем ее ‘xx’), я хочу свертку rr с этой предварительной функцией, чтобы получить новую функцыю распределения.
Если я использую ‘convolve’ из библиотеки ‘stats’, я получаю это:
convolve(xx, rr)
Ошибка в fft(x) : нечисловой аргумент
Если я использую ‘convolve’ из ‘bayesmeta’, я получаю это:
convolve(xx, rr)
Ошибка в integrate(func1, -Inf, Inf) :
достигнуто максимальное количество делений
Я пытался использовать функцию ‘convol.dens’ из пакета ‘QuantPooledTesting’ (см. https://rdrr.io/github/whitneysu/QuantitativePooledTesting/man/convol.dens.html), но не могу установить ее из CRAN, и путь через devtools тоже, похоже, не работает.
Существует ли механизм для выполнения этого с ЭКП, сгенерированными таким образом?
Ответ или решение
Для того чтобы выполнить свертку двух эмпирических функций распределения (ECDF) в R с использованием байесовских методов, необходимо понимать, как правильно работать с этими функциями. Эмпирические функции распределения представляют собой ступенчатые функции, и их свертка не может быть выполнена непосредственно с использованием стандартной функции convolve()
из пакета stats
, так как она предназначена для числовых векторов.
Шаги для свертки ECDF:
-
Создание ЭКРД:
Сначала вы правильно создаете вашу ECDF с помощью функцииecdf()
. Например:rr <- ecdf(answers)
-
Построение предварительной ECDF:
Следующий шаг — это создание предварительной ECDF (называемойxx
). Предположим, чтоxx
уже создана аналогично:xx <- ecdf(prior_distribution)
-
Преобразование ECDF в плотность:
Для свертки необходимо преобразовать ECDF в плотности. Это можно сделать с помощью численного интегрирования и дискретизации. Например:# Получаем диапазон значений x_values <- seq(min(c(answers, prior_distribution)), max(c(answers, prior_distribution)), length.out = 1000) # Получаем плотности для каждой ECDF density_rr <- diff(c(0, rr(x_values))) / diff(c(x_values[1], x_values)) density_xx <- diff(c(0, xx(x_values))) / diff(c(x_values[1], x_values))
-
Свертка плотностей:
Теперь, когда мы имеем плотности, мы можем выполнить свертку, используя функциюconvolve()
. Чтобы избежать ошибок, дополнительно стандартизируем входные данные. Например:convolved_density <- convolve(density_rr, density_xx, type = "open")
-
Получение новой ECDF:
Теперь необходимо интегрировать свертку для получения новой ECDF. Для этого можно воспользоваться численным интегрированием:cumulative_density <- cumsum(convolved_density) * diff(c(0, x_values)) new_ecdf <- ecdf(cumulative_density)
-
Построение графиков:
Для визуализации результата можно построить графики функционирующих ECDF:plot(rr, main="ECDFs and Convolved ECDF") lines(xx, col='blue') lines(new_ecdf, col='red') legend("topright", legend=c("ECDF 1", "ECDF 2", "Convolved ECDF"), col=c("black", "blue", "red"), lty=1)
Возможные ошибки:
- Ошибка аргумента
non-numeric
может возникнуть, если входные данные не являются численным вектором. Убедитесь, что все ваши входные данные в числовом формате. - Ошибка
maximum number of subdivisions reached
в функцииconvolve()
может говорить о том, что процесс интегрирования не может быть завершен из-за слишком большого количества точек или высокой сложности функции.
Заключение:
Свертка ECDF требует внимательного подхода к преобразованию и интеграции. Используя описанные методы, вы сможете успешно выполнить задачу свертки двух ECDF и получить исходные данные, необходимые для последующего анализа с использованием байесовских подходов. Не забывайте, что визуализация данных также играет важную роль в интерпретации результатов.