2017-02-07 186 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

相关问题