From d1f584245f1164dbdbe3b00f6bc798d1865dc769 Mon Sep 17 00:00:00 2001 From: Pierre Santagostini <pierre.santagostini@agrocampus-ouest.fr> Date: Wed, 17 Apr 2024 19:20:00 +0200 Subject: [PATCH] There was a problem if lambda[p]==1: Problem when computing log(1-lambda[p]) --- R/kldcauchy.R | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/R/kldcauchy.R b/R/kldcauchy.R index d2a40b2..7194a23 100644 --- a/R/kldcauchy.R +++ b/R/kldcauchy.R @@ -115,6 +115,16 @@ kldcauchy <- function(Sigma1, Sigma2, eps = 1e-06) { if (lambda[p] <= 1) { # equations 109 & 102 + if (p > 1 & lambda[p] == 1) { + lambda <- lambda[1:(p-1)] + p1 <- p-1 + M <- expand.grid(rep(list(0:k), p1)) + M <- M[-1, , drop = FALSE] + # Sum of the indices + Msum <- rowSums(M) + } else { + p1 <- p + } # The first 5 elements of the sum @@ -129,11 +139,11 @@ kldcauchy <- function(Sigma1, Sigma2, eps = 1e-06) { # } Mpoch <- sapply(Munique, function(j) lnpochhammer(0.5, j)) - matpoch <- matrix(rep(Mpoch, p), ncol = p, byrow = FALSE) - matM <- matrix(rep(Munique, p), ncol = p, byrow = FALSE) - matlabmda <- matrix(rep(log(1 - lambda), length(Munique)), ncol = p, byrow = TRUE) + matpoch <- matrix(rep(Mpoch, p1), ncol = p1, byrow = FALSE) + matM <- matrix(rep(Munique, p1), ncol = p1, byrow = FALSE) + matlabmda <- matrix(rep(log(1 - lambda), length(Munique)), ncol = p1, byrow = TRUE) lambdaM <- matlabmda*matM - matfact <- matrix(rep(lfactorial(Munique), p), ncol = p, byrow = FALSE) + matfact <- matrix(rep(lfactorial(Munique), p1), ncol = p1, byrow = FALSE) matcommun <- exp(matpoch + lambdaM - matfact) matcommun <- as.data.frame(apply(matcommun, 2, Re)) @@ -177,15 +187,15 @@ kldcauchy <- function(Sigma1, Sigma2, eps = 1e-06) { # M <- rbind( M, expand.grid(rep(list(k1), p)) ) # M: data.frame of the indices for the nested sums - M <- expand.grid(rep(list(k1), p)) - if (p > 1) { - for (i in 1:(p-1)) { - indsupp <- combn(p, i) + M <- expand.grid(rep(list(k1), p1)) + if (p1 > 1) { + for (i in 1:(p1-1)) { + indsupp <- combn(p1, i) for (j in 1:ncol(indsupp)) { jsupp <- indsupp[, j] - Mlist <- vector("list", p) + Mlist <- vector("list", p1) for (l in jsupp) Mlist[[l]] <- k1 - for (l in (1:p)[-jsupp]) Mlist[[l]] <- 0:k + for (l in (1:p1)[-jsupp]) Mlist[[l]] <- 0:k M <- rbind(M, expand.grid(Mlist)) } } @@ -208,26 +218,26 @@ kldcauchy <- function(Sigma1, Sigma2, eps = 1e-06) { # } Mpoch <- sapply(Munique, function(j) lnpochhammer(0.5, j)) - matpoch <- matrix(rep(Mpoch, p), ncol = p, byrow = FALSE) - matM <- matrix(rep(Munique, p), ncol = p, byrow = FALSE) - matlabmda <- matrix(rep(log(1 - lambda), length(Munique)), ncol = p, byrow = TRUE) + matpoch <- matrix(rep(Mpoch, p1), ncol = p1, byrow = FALSE) + matM <- matrix(rep(Munique, p1), ncol = p1, byrow = FALSE) + matlabmda <- matrix(rep(log(1 - lambda), length(Munique)), ncol = p1, byrow = TRUE) lambdaM <- matlabmda*matM - matfact <- matrix(rep(lfactorial(Munique), p), ncol = p, byrow = FALSE) + matfact <- matrix(rep(lfactorial(Munique), p1), ncol = p1, byrow = FALSE) matcommun <- rbind(matcommun, matcommunsupp) matcommunsupp <- exp(matpoch + lambdaM - matfact) matcommunsupp <- as.data.frame(apply(matcommunsupp, 2, Re)) gridcommun <- expand.grid(matcommunsupp) - if (p > 1) { - for (i in 1:(p-1)) { - indsupp <- combn(p, i) + if (p1 > 1) { + for (i in 1:(p1-1)) { + indsupp <- combn(p1, i) for (j in 1:ncol(indsupp)) { jsupp <- indsupp[, j] - communlist <- vector("list", p) + communlist <- vector("list", p1) names(communlist) <- names(gridcommun) for (l in jsupp) communlist[[l]] <- matcommunsupp[, l] - for (l in (1:p)[-jsupp]) communlist[[l]] <- matcommun[, l] + for (l in (1:p1)[-jsupp]) communlist[[l]] <- matcommun[, l] gridcommun <- rbind(gridcommun, expand.grid(communlist)) } } -- GitLab