R: как создать векторизованную функцию, где верхняя часть интеграла является переменной - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь применить тест ks.test к группе данных и пользовательскому CDF. CDF имеет следующую форму:

my_cdf <- function(x) integrate(my_pdf, 0, x, subdivisions=2000)$value

, где my_pdf - это функция, которая принимает одно значение в качестве аргумента.

Теперь, чтобы использовать ks.test, мне нужно my_cdf для создания векторизованного вывода с учетом векторного ввода. Как мне это сделать?

Пример my_pdf (Это не настоящий PDF, но это не имеет значения):

my_pdf <- function(y) y + 1

Пример задачи:

my_cdf(c(1,2,3))

[1] 1.5 4 7.5

Ответы [ 2 ]

3 голосов
/ 28 февраля 2020

Используйте Vectorize для преобразования my_cdf в векторизованную версию:

my_cdfv <- Vectorize(my_cdf)
my_cdfv(1:3)
## [1] 1.5 4.0 7.5
1 голос
/ 28 февраля 2020

Вы можете использовать sapply. Лично я бы разрешил использовать любой pdf для функции

my_cdf <- function(x, pdf)
{
  sapply(x, function(y) integrate(pdf, 0, y, subdivisions=2000)$value)
}

Так что мы можем сделать:

my_pdf <- function(y) y + 1

my_cdf(c(1, 2, 3), pdf = my_pdf)
#> [1] 1.5 4.0 7.5

или

my_cdf(c(0.1, 0.5, 1), pdf = dnorm)
#> [1] 0.03982784 0.19146246 0.34134475

Если вы уверен, что вам никогда не понадобится предоставлять другой pdf, тогда вы можете просто сделать

my_cdf <- function(x) sapply(x, function(y) integrate(my_pdf, 0, y, subdivisions=2000)$value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...