R中的错误:当我尝试应用外部函数时:

dav*_*wei -4 r outer-join contour

这是我的代码:步骤1:定义一个我将在稍后使用的反函数

inverse = function (f, lower = -100, upper = 100) {
  function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper)[1]
}
Run Code Online (Sandbox Code Playgroud)

第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)
Run Code Online (Sandbox Code Playgroud)

Step3:这是我的最终功能,它结合了上述功能(我确信功能是正确的):

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)))
}
Run Code Online (Sandbox Code Playgroud)

Step4:我想在步骤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)
Run Code Online (Sandbox Code Playgroud)

这是问题所在,当我尝试应用函数outer(x,y,copwnorm)时,它给出了一个错误:'zeroin'中的函数值无效.请问如何解决这个问题?

Fer*_*aft 5

我相信这是一个非常黎民误解假设outer(x, y, FUN)调用函数的参数(FUN)一次为每个需要对x[i]y[j].实际上,在创建所有可能的对之后,只outer调用一次,以类似于函数的方式将每个元素与每个元素组合在一起.FUNxyexpand.grid

我将表明,一个例子:考虑这个功能,这对于产品的包装和每一个它的调用时打印一条消息:

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

    x*y
}
Run Code Online (Sandbox Code Playgroud)

这个函数是"自然"矢量化的,所以我们可以用vector参数调用它:

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

使用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
Run Code Online (Sandbox Code Playgroud)

注意生成的组合.

如果我们不能保证函数可以处理向量参数,那么有一个简单的技巧可以确保函数只为组合中的每一对调用一次: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
Run Code Online (Sandbox Code Playgroud)

所以我们可以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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,结果是相同的f,因为"*"是以矢量化方式写的,即因为是矢量化的.但是如果你的功能没有考虑到这一点,直接使用它outer可能会失败或(更糟)可能会给出错误的结果.