Ошибка в R: Когда я пытаюсь применить внешнюю функцию:

Вот мой код: Шаг 1: Определите обратную функцию, которую я буду использовать позже

inverse = function (f, lower = -100, upper = 100) {
  function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper)[1]
}

Шаг 2: Вот мои функции и их обратное:

F1<-function(x,m1,l,s1,s2){l*pnorm((x-m1)/s1)+(1-l)*pnorm((x+m1)/s2)}

F1_inverse = inverse(function(x) F1(x,1,0.1,2,1) , -100, 100)

F2<-function(x,m2,l,s1,s2){l*pnorm((x-m2)/s1)+(1-l)*pnorm((x+m2)/s2)}

F2_inverse = inverse(function(x) F1(x,1,0.1,2,1) , -100, 100)

Шаг 3: Вот моя последняя функция, которая объединяет вышеупомянутые функции (я уверен, что функция правильная):

copwnorm<-function(x,y,l,mu1,mu2,sd1,sd2) {
  (l*dnorm(((F1_inverse(pnorm(x))$root-mu1)/sd1))*
    dnorm(((F2_inverse(pnorm(y))$root-mu2)/sd1)))
}

Шаг 4: Я хочу создать контурный график для функции в шагеenter code here3:

x<-seq(-2,2,0.1)
y<-seq(-2,2,0.1)

z<-outer(x,y,copwnorm)

contour(x,y,z,xlab="x",ylab="y",nlevels=15)

Здесь возникает проблема, когда я пытался применить функцию external (x,y,copwnorm), она выдает мне ошибку: недопустимое значение функции в 'zeroin'. Могу я спросить, как решить эту проблему?

1 ответ

Я считаю, что очень ошибочно считать, что outer(x, y, FUN) вызывает параметр функции (FUN) один раз для каждой необходимой пары x[i] а также y[j], На самом деле, outer звонки FUN только один раз, после создания всех возможных пар, объединяя каждый элемент x с каждым элементом yв манере, аналогичной функции expand.grid,

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

f <- function(x,y)
{
    cat("f called with arguments: x =", capture.output(dput(x)), "y =", capture.output(dput(y)), "\n")

    x*y
}

Эта функция "естественно" векторизована, поэтому мы можем вызывать ее с помощью векторных аргументов:

> f(c(1,2), c(3,4))
f called with arguments: x = c(1, 2) y = c(3, 4) 
[1] 3 8

С помощью outer:

> outer(c(1,2), c(3,4), f)
f called with arguments: x = c(1, 2, 1, 2) y = c(3, 3, 4, 4) 
     [,1] [,2]
[1,]    3    4
[2,]    6    8

Обратите внимание на сгенерированные комбинации.

Если мы не можем гарантировать, что функция может обрабатывать векторные аргументы, существует простой трюк, чтобы гарантировать, что функция вызывается только один раз для каждой пары в комбинациях: Vectorize, Это создает другую функцию, которая вызывает исходную функцию один раз для каждого элемента в аргументах:

> Vectorize(f)(c(1,2),c(3,4))
f called with arguments: x = 1 y = 3 
f called with arguments: x = 2 y = 4 
[1] 3 8

Таким образом, мы можем сделать "сейф" outer с этим:

> outer(c(1,2), c(3,4), Vectorize(f))
f called with arguments: x = 1 y = 3 
f called with arguments: x = 2 y = 3 
f called with arguments: x = 1 y = 4 
f called with arguments: x = 2 y = 4 
     [,1] [,2]
[1,]    3    4
[2,]    6    8

В этом случае результаты совпадают, потому что f был написан векторизованным способом, т. е. потому что "*" векторизован. Но если ваша функция не написана с учетом этого, используйте ее непосредственно в outer может потерпеть неудачу или (что еще хуже) может дать неправильные результаты.

Другие вопросы по тегам