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

Posted

技术标签:

【中文标题】R 中的错​​误:当我尝试应用外部函数时:【英文标题】:An Error in R: When I try to apply outer function: 【发布时间】:2013-03-14 03:22:19 【问题描述】:

这是我的代码: Step1:定义一个我稍后会用到的反函数

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)

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)))

Step4:我想为Stepenter 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' 中的函数值无效。请问这个问题怎么解决?

【问题讨论】:

什么是l?还有mu1mu2sd1sd2。我们无法运行您的代码来查看问题所在。请注意,我修复了 copwnorm 的一个问题,因为它缺少括号 - 希望我把它放在正确的位置。 Uniroot 不接受返回非标量值的函数,因此反函数中的 (function (x) f(x) - y) 在与 outer 一起使用时不起作用。 @Hemmo:看起来 copworm 会返回一个标量值,但最后 4 个参数没有默认值。我希望这会成为错误的来源。此外,没有“l”值。失败。 【参考方案1】:

我认为假设outer(x, y, FUN) 为每个必需的x[i]y[j] 对调用函数参数(FUN) 一次,这是一个非常普遍的误解。实际上,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 中使用它可能会失败,或者(更糟)可能会给出错误的结果。

【讨论】:

这很有帮助,非常感谢!

以上是关于R 中的错​​误:当我尝试应用外部函数时:的主要内容,如果未能解决你的问题,请参考以下文章

如何纠正 R 函数中的变异和过滤错误

函数R中的Dplyr变量名称

在 R 中解析引号:Quantmod 应用程序

如何将 sqlSave 函数与 R 中的现有表一起使用

无法连接到 SQLCLR 中的外部数据库

外部应用在不匹配时意外返回列NOT NULL