Свертка двух ЭКДФ в R

Вопрос или проблема

Я хочу применить некоторые байесовские методы к эмпирической функции накопленной плотности, которую генерирует мой код на 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:

  1. Создание ЭКРД:
    Сначала вы правильно создаете вашу ECDF с помощью функции ecdf(). Например:

    rr <- ecdf(answers)
  2. Построение предварительной ECDF:
    Следующий шаг — это создание предварительной ECDF (называемой xx). Предположим, что xx уже создана аналогично:

    xx <- ecdf(prior_distribution)
  3. Преобразование 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))
  4. Свертка плотностей:
    Теперь, когда мы имеем плотности, мы можем выполнить свертку, используя функцию convolve(). Чтобы избежать ошибок, дополнительно стандартизируем входные данные. Например:

    convolved_density <- convolve(density_rr, density_xx, type = "open")
  5. Получение новой ECDF:
    Теперь необходимо интегрировать свертку для получения новой ECDF. Для этого можно воспользоваться численным интегрированием:

    cumulative_density <- cumsum(convolved_density) * diff(c(0, x_values))
    new_ecdf <- ecdf(cumulative_density)
  6. Построение графиков:
    Для визуализации результата можно построить графики функционирующих 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 и получить исходные данные, необходимые для последующего анализа с использованием байесовских подходов. Не забывайте, что визуализация данных также играет важную роль в интерпретации результатов.

Оцените материал
Добавить комментарий

Капча загружается...