R中的错误:当我尝试应用外部函数时:
发布时间:2020-12-12 16:22:14 所属栏目:MsSql教程 来源:网络整理
导读:这是我的代码: 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)
这是我的代码:
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,s2){l*pnorm((x-m2)/s1)+(1-l)*pnorm((x+m2)/s2)} F2_inverse = inverse(function(x) F1(x,100) Step3:这是我的最终功能,它结合了上述功能(我确信功能是正确的): copwnorm<-function(x,y,mu1,mu2,sd1,sd2) { (l*dnorm(((F1_inverse(pnorm(x))$root-mu1)/sd1))* dnorm(((F2_inverse(pnorm(y))$root-mu2)/sd1))) } Step4:我想在这里用Stepenter代码为函数创建一个等高线图: x<-seq(-2,0.1) y<-seq(-2,0.1) z<-outer(x,copwnorm) contour(x,z,xlab="x",ylab="y",nlevels=15) 这是问题所在,当我尝试应用函数outer(x,copwnorm)时,它给出了一个错误:’zeroin’中的函数值无效.请问如何解决这个问题? 解决方法我认为假设外部(x,FUN)为每个所需的对x [i]和y [j]调用函数参数(FUN)是一个非常普遍的误解.实际上,在创建所有可能的对之后,外部调用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 } 这个函数是“自然”矢量化的,所以我们可以用vector参数调用它: > f(c(1,2),c(3,4)) f called with arguments: x = c(1,2) y = c(3,4) [1] 3 8 使用外部: > outer(c(1,4),f) f called with arguments: x = c(1,3,4,4) [,1] [,2] [1,] 3 4 [2,] 6 8 注意生成的组合. 如果我们不能保证函数可以处理向量参数,那么有一个简单的技巧可以确保函数只为组合中的每一对调用一次:Vectorize.这创建了另一个函数,它为参数中的每个元素调用一次原始函数: > Vectorize(f)(c(1,4)) f called with arguments: x = 1 y = 3 f called with arguments: x = 2 y = 4 [1] 3 8 所以我们可以用它做一个“安全”的外表: > outer(c(1,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 [,] 6 8 在这种情况下,结果是相同的,因为f是以矢量化方式写入的,即因为“*”是矢量化的.但是如果你的功能没有考虑到这一点,直接在外部使用它可能会失败或(更糟)可能会给出错误的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |