2016-12-31 8 views
1

を使用して期待どおりに勾配ベクトルを返します!リターンのOptim機能とcolSums

誰もこのコードを修正するための提案はありますか?

loglik <- function(beta) { 
    NXS <- dim(model.matrix(~XS))[2]#Numbers of columns of XS+1 
    NXO <- dim(model.matrix(~XO))[2]#Numbers of columns of XO+1 
    ## parameter indices 
    ibetaS <- 1:NXS 
    ibetaO <- seq(tail(ibetaS, 1)+1, length=NXO) 
    isigma <- tail(ibetaO, 1) + 1 
    irho <- tail(isigma, 1) + 1 
    g <- beta[ibetaS] 
    b <- beta[ibetaO] 
    sigma <- beta[isigma] 
    if(sigma < 0) return(NA) 
    rho <- beta[irho] 
    if((rho < -1) || (rho > 1)) return(NA) 

    XS.g <- model.matrix(~XS) %*% g 
    XO.b <- model.matrix(~XO) %*% b 
    u2 <- YO - XO.b 
    r <- sqrt(1 - rho^2) 
    B <- (XS.g + rho/sigma*u2)/r 
    ll <- ifelse(YS == 0, 
       (pnorm(-XS.g, log.p=TRUE)), 
       dnorm(u2/sigma, log = TRUE) - log(sigma) + 
       (pnorm(B, log.p=TRUE)) 
) 
    sum(ll) 
} 

gradlik <- function(beta) { 
    NXS <- dim(model.matrix(~XS))[2] 
    NXO <- dim(model.matrix(~XO))[2] 
    nObs <- length(YS) 
    NO <- length(YS[YS > 0]) 
    nParam <- NXS + NXO + 2 #Total of parameters 

    XS0 <- XS[YS==0,,drop=FALSE] 
    XS1 <- XS[YS==1,,drop=FALSE] 
    YO[is.na(YO)] <- 0 
    YO1 <- YO[YS==1] 
    XO1 <- XO[YS==1,,drop=FALSE] 
    N0 <- sum(YS==0) 
    N1 <- sum(YS==1) 

    w <- rep(1,N0+N1) 
    w0 <- rep(1,N0) 
    w1 <- rep(1,N1) 
    NXS <- dim(model.matrix(~XS))[2] 
    NXO <- dim(model.matrix(~XO))[2] 
    ## parameter indices 
    ibetaS <- 1:NXS 
    ibetaO <- seq(tail(ibetaS, 1)+1, length=NXO) 
    isigma <- tail(ibetaO, 1) + 1 
    irho <- tail(isigma, 1) + 1 

    g <- beta[ibetaS] 
    b <- beta[ibetaO] 
    sigma <- beta[isigma] 
    if(sigma < 0) return(matrix(NA, nObs, nParam)) 
    rho <- beta[irho] 
    if((rho < -1) || (rho > 1)) return(matrix(NA, nObs, nParam)) 
    XS0.g <- as.numeric(model.matrix(~XS0) %*% g) 
    XS1.g <- as.numeric(model.matrix(~XS1) %*% g) 
    XO1.b <- as.numeric(model.matrix(~XO1) %*% b) 
    #  u2 <- YO1 - XO1.b 
    u2 <- YO1 - XO1.b 
    r <- sqrt(1 - rho^2) 
    #  B <- (XS1.g + rho/sigma*u2)/r 
    B <- (XS1.g + rho/sigma*u2)/r 
    lambdaB <- exp(dnorm(B, log = TRUE) - pnorm(B, log.p = TRUE)) 
    gradient <- matrix(0, nObs, nParam) 
    gradient[YS == 0, ibetaS] <- - w0 * model.matrix(~XS0) * 
    exp(dnorm(-XS0.g, log = TRUE) - pnorm(-XS0.g, log.p = TRUE)) 
    gradient[YS == 1, ibetaS] <- w1 * model.matrix(~XS1) * lambdaB/r 
    gradient[YS == 1, ibetaO] <- w1 * model.matrix(~XO1) * (u2/sigma^2 - lambdaB*rho/sigma/r) 
    gradient[YS == 1, isigma] <- w1 * ((u2^2/sigma^3 - lambdaB*rho*u2/sigma^2/r) - 1/sigma) 
    gradient[YS == 1, irho] <- w1 * (lambdaB*(u2/sigma + rho*XS1.g))/r^3 
    return(colSums(gradient)) 
} 

n=1000 
X1 <- runif(n) 
X2 <- runif(n) 
XO <- cbind(X1,X2) 
X3 <- runif(n) 
XS <- cbind(X1,X2,X3) 
YS <- sample(c(0,1),n,replace = TRUE) 
YO <- sample(100:400,n,replace = TRUE)*YS 
beta <- c(1,1,1,1,1,1,1,1,0.5) 

#Note that the function below compiles normally: 

gradlik(beta) 

#But the Optim function does not compile: 

theta <-optim(beta,loglik, gradlik, method = "BFGS",hessian = T,control=list(fnscale=-1)) 
theta$par 
+0

を私はtheta''に割り当てたコードでエラーが出ます、gradlik、method = "BFGS"、hessian = T、control = list(fnscale = -1)): の勾配は長さ9000ではなく9000と評価されます。 「グラデーションをコンパイルする」という意味ははっきりしません。 Rは解釈される言語です。あなたは何らかの不特定のデバッグをしていますか? –

+0

問題はこれです、グラデーションのサイズは「9000」で、「9」ではありませんか?問題は明らかです!私は指定されていない解釈をしない!私はちょうどなぜこのエラーが理解できない! – fsbmat

答えて

0

グラデーション関数では、パラメータの数と同じサイズのベクトルを出力する必要があります。あなたの最終return()ながら

は、あなたの現在の実装では、他の二つのreturn()あなたはまだ行列を返すコードの真ん中にありますが、実際のベクトルです。

は、例えば、コードをsigma <0するときの戻り:

if(sigma < 0) return(matrix(NA, nObs, nParam)) 

したがってそのエラーメッセージに記載されているようoptim()は文句作る、9000×9の行列です。

ときも(rho < -1) || (rho > 1)あなたの関数の戻り値:

if((rho < -1) || (rho > 1)) return(matrix(NA, nObs, nParam)) 

どの、再び、エラーになり、9000×9行列です。

したがって、コードの部分を修正して、パラメータの数と同じサイズのベクトルを返すように変更する必要があります。

この実行し、行列を返すあなたのコードの例を参照するには、次の.... `OPTIMでエラーが発生しました(ベータ版、loglik:

gradlik(rep(-1, 9)) 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
    [1,] NA NA NA NA NA NA NA NA NA 
    [2,] NA NA NA NA NA NA NA NA NA 
    [3,] NA NA NA NA NA NA NA NA NA 
    [4,] NA NA NA NA NA NA NA NA NA 
    [5,] NA NA NA NA NA NA NA NA NA 
    [6,] NA NA NA NA NA NA NA NA NA 
    [7,] NA NA NA NA NA NA NA NA NA 
    [8,] NA NA NA NA NA NA NA NA NA 
    [9,] NA NA NA NA NA NA NA NA NA 
    [10,] NA NA NA NA NA NA NA NA NA 
    [11,] NA NA NA NA NA NA NA NA NA 
    [12,] NA NA NA NA NA NA NA NA NA 
    [13,] NA NA NA NA NA NA NA NA NA 
    [14,] NA NA NA NA NA NA NA NA NA 
    [15,] NA NA NA NA NA NA NA NA NA 
    [16,] NA NA NA NA NA NA NA NA NA 
    [17,] NA NA NA NA NA NA NA NA NA 
    [18,] NA NA NA NA NA NA NA NA NA 
    [19,] NA NA NA NA NA NA NA NA NA 
    [20,] NA NA NA NA NA NA NA NA NA 
    [21,] NA NA NA NA NA NA NA NA NA 
    [22,] NA NA NA NA NA NA NA NA NA 
    [23,] NA NA NA NA NA NA NA NA NA 
    [24,] NA NA NA NA NA NA NA NA NA 
    [25,] NA NA NA NA NA NA NA NA NA 
    [26,] NA NA NA NA NA NA NA NA NA 
    [27,] NA NA NA NA NA NA NA NA NA 
    [28,] NA NA NA NA NA NA NA NA NA 
    [29,] NA NA NA NA NA NA NA NA NA 
    [30,] NA NA NA NA NA NA NA NA NA 
    [31,] NA NA NA NA NA NA NA NA NA 
    [32,] NA NA NA NA NA NA NA NA NA 
    [33,] NA NA NA NA NA NA NA NA NA 
    [34,] NA NA NA NA NA NA NA NA NA 
    [35,] NA NA NA NA NA NA NA NA NA 
    [36,] NA NA NA NA NA NA NA NA NA 
    [37,] NA NA NA NA NA NA NA NA NA 
    [38,] NA NA NA NA NA NA NA NA NA 
    [39,] NA NA NA NA NA NA NA NA NA 
    [40,] NA NA NA NA NA NA NA NA NA 
    [41,] NA NA NA NA NA NA NA NA NA 
    [42,] NA NA NA NA NA NA NA NA NA 
    [43,] NA NA NA NA NA NA NA NA NA 
    [44,] NA NA NA NA NA NA NA NA NA 
    [45,] NA NA NA NA NA NA NA NA NA 
    [46,] NA NA NA NA NA NA NA NA NA 
    [47,] NA NA NA NA NA NA NA NA NA 
    [48,] NA NA NA NA NA NA NA NA NA 
    [49,] NA NA NA NA NA NA NA NA NA 
    [50,] NA NA NA NA NA NA NA NA NA 
    [51,] NA NA NA NA NA NA NA NA NA 
    [52,] NA NA NA NA NA NA NA NA NA 
    [53,] NA NA NA NA NA NA NA NA NA 
    [54,] NA NA NA NA NA NA NA NA NA 
    [55,] NA NA NA NA NA NA NA NA NA 
    [56,] NA NA NA NA NA NA NA NA NA 
    [57,] NA NA NA NA NA NA NA NA NA 
    [58,] NA NA NA NA NA NA NA NA NA 
    [59,] NA NA NA NA NA NA NA NA NA 
    [60,] NA NA NA NA NA NA NA NA NA 
    [61,] NA NA NA NA NA NA NA NA NA 
    [62,] NA NA NA NA NA NA NA NA NA 
    [63,] NA NA NA NA NA NA NA NA NA 
    [64,] NA NA NA NA NA NA NA NA NA 
    [65,] NA NA NA NA NA NA NA NA NA 
    [66,] NA NA NA NA NA NA NA NA NA 
    [67,] NA NA NA NA NA NA NA NA NA 
    [68,] NA NA NA NA NA NA NA NA NA 
    [69,] NA NA NA NA NA NA NA NA NA 
    [70,] NA NA NA NA NA NA NA NA NA 
    [71,] NA NA NA NA NA NA NA NA NA 
    [72,] NA NA NA NA NA NA NA NA NA 
    [73,] NA NA NA NA NA NA NA NA NA 
    [74,] NA NA NA NA NA NA NA NA NA 
    [75,] NA NA NA NA NA NA NA NA NA 
    [76,] NA NA NA NA NA NA NA NA NA 
    [77,] NA NA NA NA NA NA NA NA NA 
    [78,] NA NA NA NA NA NA NA NA NA 
    [79,] NA NA NA NA NA NA NA NA NA 
    [80,] NA NA NA NA NA NA NA NA NA 
    [81,] NA NA NA NA NA NA NA NA NA 
    [82,] NA NA NA NA NA NA NA NA NA 
    [83,] NA NA NA NA NA NA NA NA NA 
    [84,] NA NA NA NA NA NA NA NA NA 
    [85,] NA NA NA NA NA NA NA NA NA 
    [86,] NA NA NA NA NA NA NA NA NA 
    [87,] NA NA NA NA NA NA NA NA NA 
    [88,] NA NA NA NA NA NA NA NA NA 
    [89,] NA NA NA NA NA NA NA NA NA 
    [90,] NA NA NA NA NA NA NA NA NA 
    [91,] NA NA NA NA NA NA NA NA NA 
    [92,] NA NA NA NA NA NA NA NA NA 
    [93,] NA NA NA NA NA NA NA NA NA 
    [94,] NA NA NA NA NA NA NA NA NA 
    [95,] NA NA NA NA NA NA NA NA NA 
    [96,] NA NA NA NA NA NA NA NA NA 
    [97,] NA NA NA NA NA NA NA NA NA 
    [98,] NA NA NA NA NA NA NA NA NA 
    [99,] NA NA NA NA NA NA NA NA NA 
[100,] NA NA NA NA NA NA NA NA NA 
[101,] NA NA NA NA NA NA NA NA NA 
[102,] NA NA NA NA NA NA NA NA NA 
[103,] NA NA NA NA NA NA NA NA NA 
[104,] NA NA NA NA NA NA NA NA NA 
[105,] NA NA NA NA NA NA NA NA NA 
[106,] NA NA NA NA NA NA NA NA NA 
[107,] NA NA NA NA NA NA NA NA NA 
[108,] NA NA NA NA NA NA NA NA NA 
[109,] NA NA NA NA NA NA NA NA NA 
[110,] NA NA NA NA NA NA NA NA NA 
[111,] NA NA NA NA NA NA NA NA NA 
[ reached getOption("max.print") -- omitted 889 rows ]