我有一個簡單的危險函數,導致錯誤的行被標記。不確定在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) }
您是否嘗試過使用'traceback()'檢查調用鏈?如果這沒有用,那麼發佈一個小數據集(使用'dput'),該操作失敗並出現該錯誤。 –
嗨,我應該如何使用dput?我輸入了dput(alldata,「exampledata」)並得到了一個不太合理的奇怪文件。 – Patty
通過將錯誤的數據輸入到其他函數中導致錯誤。從函數中的「錯誤行」向下註釋掉所有內容,然後開始打印錯誤行中引用的每個對象。 – Elin