2017-02-07 221 views
1

我有一個簡單的危險函數,導致錯誤的行被標記。不確定在R(pmvt - Package:mvtnorm)中導致此錯誤的原因是什麼?

h <- function(t,u) { 
    x <- 1 - Sa(t) 
    y <- 1 - Sm(u) 
    invx <- as.numeric(qt(x,df=d1)) 
    invy <- as.numeric(qt(x,df=d1)) 
    [ERROR LINE] copula <- pmvt(lower=as.numeric(cbind(-9999,-9999)),upper=cbind(invx,invy),df=d1,corr=matrix(cbind(1,d2,d2,1),byrow=T,ncol=2) ) 
    density <- dmvt(cbind(invx,invy),sigma=matrix(cbind(1,d2,d2,1),byrow=T,ncol=2),df=d1) 
    num <- (sa(t)*sm(u))*density/dt(invx,df=d1)/dt(invy,df=d1) 
    den <- 1 - x - y + copula 
    hazard <- num/den 
    return(hazard) 
} 

這種危害功能,然後通過一個似然函數呼籲:

# log Likelihood function for each individual car i 
lli <- function(data) { 
    result <- 0; 
    # for all claims, evaluate hazard function at that point 
    if (nrow(data)> 2) { 
    for (k in 1:nrow(data)) { 
     if (data[k,3] == 1) { 
    result <- result + log(h(data[k,2],data[k,1])); 
     } 
    } 
    } 
    # integrate hazard function over areas between claims 
    for (k in 1:(nrow(data)-1)) { 
    integral <- quad2d(h,data[k,2],data[k+1,2],data[k,1],data[k+1,1]); 
    result <- result - integral; 
    } 
    return(result) 
} 

現在這個似然函數然後由第三函數調用上了我的整個數據集使用; 但它是導致錯誤的上述功能,而不是低於

# log Likelihood function over all vehicles 
ll <- function(x) { 
# Unpack parameters 
    d1 <<- x[1]; 
    d2 <<- x[2]; 
    total <- 0; 
    # Get log Likelihood for each vehicle 
    for (i in 1:length(alldata)) { 
    total <- total + lli(alldata[[i]]); 
    #print(sprintf("Found candidate solution %d value: %f",i,total)); 
    } 
    #print(sprintf("Found candidate solution value: %f",total)); 
    if (is.nan(total)) { #If it is undefined, make it a large negative number 
    total <- -2147483647 ; 
    } 
    return(-1*total); # Minimise instead of maximise 
} 

錯誤消息的功能如下:

> ll(cbind(50,0.923)) 
Error in checkmvArgs(lower = lower, upper = upper, mean = delta, corr = corr, : 
    ‘diag(corr)’ and ‘lower’ are of different length 

我一直使用pmvnorm時,得到同樣的錯誤,並結束不得不使用pbivnorm包來解決這個問題。儘管如此,我無法找到二元t分佈的替代方案。我不明白問題是什麼。當我自己調用函數h(t,u)時,它會毫無問題地執行。但是,當lli(數據)調用h(t,u)時,它不起作用。更奇怪的是,它們的長度相同。

> length(as.numeric(cbind(-9999,-9999))) 
[1] 2 
> length(diag(matrix(cbind(1,d2,d2,1),byrow=T,ncol=2))) 
[1] 2 

對於亂碼,我表示歉意。我不太用R。無論如何,這讓我完全陷入困境。

數據文件是在這裏:https://files.fm/u/yx9pw2b3


附加代碼我忘了,包括,基本上一些常量和邊際CDF功能:

Marginals.R:

p1 <- 0.4994485; 
p2 <- 0.2344439; 
p3 <- 0.1151654; 
p4 <- 0.1509421; 

b1 <- 0.7044292 
t1 <- 1713.3170267 
mu1 <- 7.014415 
sig1 <- 1.394735 
mu2 <- 6.926146 
sig2 <- 1.056647 
mu3 <- 6.7995896 
sig3 <- 0.7212853 
b2 <- 0.6444582 
t2 <- 762.9962093 
b3 <- 1.494303 
t3 <- 410.828780 

b1 <- 0.903 
t1 <- 864.896 
b2 <- 0.9109 
t2 <- 314.2946 
# Marginal survival distribution and density 
Sa <- function(t) {return(exp(-(t/t1) ** b1))} 
Sm <- function(u) {return(exp(-(u/t2) ** b2))} 
sa <- function(t) {return((t/t1) ** b1 * b1 * exp(-(t/t1) ** b1)/t) } 
sm <- function(u) {return((u/t2) ** b2 * b2 * exp(-(u/t2) ** b2)/u) } 
+0

您是否嘗試過使用'traceback()'檢查調用鏈?如果這沒有用,那麼發佈一個小數據集(使用'dput'),該操作失敗並出現該錯誤。 –

+0

嗨,我應該如何使用dput?我輸入了dput(alldata,「exampledata」)並得到了一個不太合理的奇怪文件。 – Patty

+0

通過將錯誤的數據輸入到其他函數中導致錯誤。從函數中的「錯誤行」向下註釋掉所有內容,然後開始打印錯誤行中引用的每個對象。 – Elin

回答

1

總結:
問題是012之間的差異長度和upper主叫pvmt,其upper具有2048的長度時,雖然lower具有2.

推理的長度:
1. pmvt通過mvtnorm包調用checkmvArgs檢查未來參數。
2.在checkmvArgslower,uppermean已被放在一起了rec <- cbind(lower, upper, mean)。這裏所述新數據rec具有2048行,而不是2.
3. lower然後通過lower <- rec[, "lower"]取代,其lower現在具有長度爲2048而不是2
4。鑑於corr仍然是一個2×2矩陣,檢查length(corr) != length(lower)

解時,會發生錯誤:

invx <- as.numeric(qt(x,df=d1)) 
    invy <- as.numeric(qt(x,df=d1)) 

upper意味着是一個長度爲2矢量,因此invxinvy需要是單一的數字。

由於不知道你想定義的上限範圍是什麼,我無法進一步解決它。可能的一個是:

invx <- as.numeric(qt(x,df=d1)) 
    invy <- as.numeric(qt(x,df=d1)) 
    copula <- pmvt(lower=as.numeric(cbind(-9999,-9999)),upper=range(c(invx,invy)),df=d1,corr=matrix(c(1,d2,d2,1),byrow=T,ncol=2) ) 

其使用的invxinvy作爲輸入的範圍內。因此dmvt不會受到影響。

注:
作爲價值a,因此未提供以下(呼叫dmvt)下一行錯誤行失敗。

編輯: 爲了使問題更具體的: 1. quad2d將產生將被默認創建在給定範圍的32的長度的高斯 - 勒讓德正交。並且,
2.您的函數h然後用來自此Gauss-Legendre正交的x和y調用。因此,h中定義的tu不是一個單獨的mumber,而是一個向量。

+0

我不明白爲什麼你認爲upper有長度2048?這裏invx和invy只是數字,所以當我綁定他們時,他們得到長度2?我嘗試使用範圍(c(invx,invy))並且仍然出現錯誤。我很難理解這個錯誤。 另外,對不起,「a」是一個錯字。它應該是1.我糾正了這一點。 感謝您的幫助! – Patty

+0

@Patty,我在調試和跟蹤'll'函數的代碼時發現了這個問題。正如你所提到的,這個問題是在'quad2d'函數中產生的,因爲'網格'網格被生成並且被用作輸入調用'h'函數。問題是'Mesh'網格不是2x2矩陣。 –

+0

我現在明白了。我錯誤地解釋了你的答案。它修復了一切。謝謝你!你已經幫了我很多錢,非常感謝你。希望我能給予更大的獎勵。 – Patty

相關問題