2013-03-24 84 views
-5

這裏是我的代碼: 第一步:定義,我將在後面使用R中的錯誤:當我嘗試申請外部函數:

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

第二步一個反函數:這裏是我的功能和它的反:

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) 

第三步:這裏是我的,結合上述功能的最終功能(我相信功能是正確的):

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

第四步:我想創建步驟爲函數的等高線圖enter code here 3:

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) 

這是問題所在進來,當我試圖申請功能外(X,Y,copwnorm),它給我錯誤:'零點'中的函數無效值。請問如何解決這個問題?

+0

'l'是什麼?而'mu1','mu2','sd1'和'sd2'就是這個問題。我們無法運行您的代碼來查看錯誤。並注意我解決了一個問題,因爲它缺少一個括號,希望我在正確的位置得到了答案。 – 2013-03-24 19:16:47

+0

Uniroot不接受帶返回非標量值的函數,所以在與「outer」一起使用時,反函數中的'(函數(x)f(x) - y)'不起作用。 – 2013-03-24 20:57:30

+0

@Hemmo:看起來copworm會返回一個標量值,但最後4個參數沒有默認值。我希望這會成爲錯誤的根源。此外沒有'l'值。失敗。 – 2013-03-25 06:59:08

回答

3

我相信這是一個非常黎民誤解假設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中使用它可能會失敗或(更糟糕)可能會導致錯誤的結果。

相關問題