|
216 | 216 |
|
217 | 217 | output <- list(
|
218 | 218 | distribution = distributionText,
|
219 |
| - mean = .betaMeanLS(alpha, beta, lower, upper), |
220 |
| - median = .qbetaLS(.5, alpha, beta, lower, upper), |
221 |
| - mode = .betaModeLS(alpha, beta, lower, upper), |
222 |
| - lCI = .qbetaLS(.025, alpha, beta, lower, upper), |
223 |
| - uCI = .qbetaLS(.975, alpha, beta, lower, upper) |
| 219 | + mean = try(.betaMeanLS(alpha, beta, lower, upper)), |
| 220 | + median = try(.qbetaLS(.5, alpha, beta, lower, upper)), |
| 221 | + mode = try(.betaModeLS(alpha, beta, lower, upper)), |
| 222 | + lCI = try(.qbetaLS(.025, alpha, beta, lower, upper)), |
| 223 | + uCI = try(.qbetaLS(.975, alpha, beta, lower, upper)) |
224 | 224 | )
|
225 | 225 |
|
| 226 | + # check and recover from errors |
| 227 | + output <- .checkAndRecoverErrors(output) |
226 | 228 |
|
227 | 229 | return(output)
|
228 | 230 | }
|
|
262 | 264 | tempPostUper <- stats::pbeta(tempPrior[["truncationUpper"]], data$nSuccesses + tempPrior[["betaPriorAlpha"]], data$nFailures + tempPrior[["betaPriorBeta"]])
|
263 | 265 |
|
264 | 266 | logLik[i] <- logLik[i] + log(tempPostUper - tempPostLower) - log(tempPriorUpper - tempPriorLower)
|
265 |
| - |
266 | 267 | }
|
267 | 268 |
|
268 | 269 | }
|
269 | 270 |
|
| 271 | + if (is.infinite(logLik[i])) |
| 272 | + logLik[i] <- NA |
270 | 273 |
|
271 | 274 | } else {
|
272 | 275 | logLik[i] <- 0
|
|
277 | 280 | if (data$nSuccesses + data$nFailures > 0) {
|
278 | 281 |
|
279 | 282 | priorWeightLogLik <- log(prior) + logLik
|
280 |
| - normConst <- log(sum(exp(priorWeightLogLik))) |
| 283 | + normConst <- log(sum(exp(priorWeightLogLik), na.rm = TRUE)) |
281 | 284 | posterior <- exp(priorWeightLogLik - normConst)
|
282 | 285 |
|
283 | 286 | } else {
|
|
335 | 338 |
|
336 | 339 | output <- list(
|
337 | 340 | distribution = distributionText,
|
338 |
| - mean = .bbinomMeanLS(n, alpha, beta, lower, upper) / d, |
339 |
| - median = .qbbinomLS(.5, n, alpha, beta, lower, upper) / d, |
340 |
| - mode = .bbinomModeLS(n, alpha, beta, lower, upper, prop = prop), |
341 |
| - lCI = .qbbinomLS(0.025, n, alpha, beta, lower, upper) / d, |
342 |
| - uCI = .qbbinomLS(0.975, n, alpha, beta, lower, upper) / d, |
343 |
| - SD = .bbinomSdLS(n, alpha, beta, lower, upper) / d |
| 341 | + mean = try(.bbinomMeanLS(n, alpha, beta, lower, upper) / d), |
| 342 | + median = try(.qbbinomLS(.5, n, alpha, beta, lower, upper) / d), |
| 343 | + mode = try(.bbinomModeLS(n, alpha, beta, lower, upper, prop = prop)), |
| 344 | + lCI = try(.qbbinomLS(0.025, n, alpha, beta, lower, upper) / d), |
| 345 | + uCI = try(.qbbinomLS(0.975, n, alpha, beta, lower, upper) / d), |
| 346 | + SD = try(.bbinomSdLS(n, alpha, beta, lower, upper) / d) |
344 | 347 | )
|
345 | 348 |
|
| 349 | + # check and recover from errors |
| 350 | + output <- .checkAndRecoverErrors(output) |
| 351 | + |
346 | 352 | return(output)
|
347 | 353 | }
|
348 | 354 | }
|
|
666 | 672 | if (lower == 0 && upper == 1) {
|
667 | 673 | return(stats::dbeta(x, alpha, beta))
|
668 | 674 | } else {
|
669 |
| - num <- stats::dbeta(x, alpha, beta) |
670 |
| - den <- pbeta(upper, alpha, beta) - pbeta(lower, alpha, beta) |
671 |
| - lik <- num/den |
| 675 | + num <- stats::dbeta(x, alpha, beta, log = TRUE) |
| 676 | + den <- log(pbeta(upper, alpha, beta) - pbeta(lower, alpha, beta)) |
| 677 | + lik <- exp(num - den) |
672 | 678 | lik[x < lower | x > upper] <- 0
|
| 679 | + lik[is.nan(lik)] <- NA |
673 | 680 | return(lik)
|
674 | 681 | }
|
675 | 682 | }
|
|
683 | 690 | p <- (p - C1) / (C2 - C1)
|
684 | 691 | p[x < lower] <- 0
|
685 | 692 | p[x > upper] <- 1
|
| 693 | + p[is.nan(p)] <- NA |
686 | 694 | return(p)
|
687 | 695 | }
|
688 | 696 | }
|
|
692 | 700 | } else {
|
693 | 701 |
|
694 | 702 | q <- sapply(x, function(xi) {
|
695 |
| - stats::optim( |
| 703 | + tempOptim <- stats::optim( |
696 | 704 | par = (lower + upper) / 2 ,
|
697 | 705 | fn = function(p) ( .pbetaLS(p, alpha, beta, lower, upper) - xi)^2,
|
698 | 706 | lower = lower,
|
699 | 707 | upper = upper,
|
700 |
| - method = "L-BFGS-B", |
701 |
| - control = list( |
702 |
| - factr = 1e3 |
703 |
| - ) |
704 |
| - )$par |
| 708 | + method = "Brent" |
| 709 | + ) |
| 710 | + if (is.na(tempOptim$value) || tempOptim$value > 1e-5) |
| 711 | + return(NA) |
| 712 | + else |
| 713 | + return(tempOptim$par) |
705 | 714 | })
|
706 |
| - |
707 | 715 | return(q)
|
708 | 716 | }
|
709 | 717 | }
|
710 | 718 | .betaMeanLS <- function(alpha, beta, lower = 0, upper = 1){
|
711 | 719 | if (lower == 0 && upper == 1) {
|
712 | 720 | return(alpha / (alpha + beta))
|
713 | 721 | } else {
|
714 |
| - return(stats::integrate(function(x) x * .dbetaLS(x, alpha, beta, lower, upper), lower, upper)$value) |
| 722 | + tempMean <- stats::integrate(function(x) x * .dbetaLS(x, alpha, beta, lower, upper), lower, upper)$value |
| 723 | + if (tempMean < lower || tempMean > upper) |
| 724 | + stop("Mean is outside of the truncation bounds -- numerical precision error.") |
| 725 | + return(tempMean) |
715 | 726 | }
|
716 | 727 | }
|
717 | 728 | .betaModeLS <- function(alpha, beta, lower = 0, upper = 1){
|
|
746 | 757 | return(extraDistr::dbbinom(x, size, alpha, beta))
|
747 | 758 | } else {
|
748 | 759 | return(sapply(x, function(xi) {
|
749 |
| - integrate( |
| 760 | + tempInt <- try(integrate( |
750 | 761 | f = function(p) {
|
751 | 762 | stats::dbinom(x = xi, size = size, prob = p) * .dbetaLS(p, alpha, beta, lower, upper)
|
752 | 763 | },
|
753 | 764 | lower = lower,
|
754 |
| - upper = upper)$value |
| 765 | + upper = upper)) |
| 766 | + if (jaspBase::isTryError(tempInt)) |
| 767 | + return(NA) |
| 768 | + else |
| 769 | + return(tempInt$value) |
755 | 770 | }))
|
756 | 771 | }
|
757 | 772 | }
|
|
892 | 907 | x <- qbinom(c((1 - coverage)/2 + 1e-5, 1 - (1 - coverage)/2), n, prior[["spikePoint"]])
|
893 | 908 | else if (prior[["type"]] == "beta")
|
894 | 909 | x <- c(
|
895 |
| - .qbbinomLS((1 - coverage)/2 + 1e-5, n, prior[["betaPriorAlpha"]] + data$nSuccesses, prior[["betaPriorBeta"]] + data$nFailures, prior[["truncationLower"]], prior[["truncationUpper"]]), |
896 |
| - .qbbinomLS(1 - (1 - coverage)/2, n , prior[["betaPriorAlpha"]] + data$nSuccesses, prior[["betaPriorBeta"]] + data$nFailures, prior[["truncationLower"]], prior[["truncationUpper"]]) |
| 910 | + .qbbinomLS((1 - coverage)/2 + 1e-5, n, prior[["betaPriorAlpha"]] + data$nSuccesses, prior[["betaPriorBeta"]] + data$nFailures, prior[["truncationLower"]], prior[["truncationUpper"]]), |
| 911 | + .qbbinomLS(1 - (1 - coverage)/2, n, prior[["betaPriorAlpha"]] + data$nSuccesses, prior[["betaPriorBeta"]] + data$nFailures, prior[["truncationLower"]], prior[["truncationUpper"]]) |
897 | 912 | )
|
898 | 913 |
|
899 | 914 |
|
|
908 | 923 |
|
909 | 924 | if (prior[["type"]] == "spike")
|
910 | 925 | coverage <- ifelse (lCI <= prior[["spikePoint"]] & prior[["spikePoint"]] <= uCI, 1, 0)
|
911 |
| - else if (prior[["type"]] == "beta") |
912 |
| - coverage <- .pbetaLS(uCI, prior[["betaPriorAlpha"]] + data$nSuccesses, prior[["betaPriorBeta"]] + data$nFailures, prior[["truncationLower"]], prior[["truncationUpper"]]) - |
913 |
| - .pbetaLS(lCI, prior[["betaPriorAlpha"]] + data$nSuccesses, prior[["betaPriorBeta"]] + data$nFailures, prior[["truncationLower"]], prior[["truncationUpper"]]) |
| 926 | + else if (prior[["type"]] == "beta") { |
| 927 | + if (uCI >= prior[["truncationUpper"]] && lCI <= prior[["truncationLower"]]) |
| 928 | + coverage <- 1 |
| 929 | + else |
| 930 | + coverage <- .pbetaLS(uCI, prior[["betaPriorAlpha"]] + data$nSuccesses, prior[["betaPriorBeta"]] + data$nFailures, prior[["truncationLower"]], prior[["truncationUpper"]]) - |
| 931 | + .pbetaLS(lCI, prior[["betaPriorAlpha"]] + data$nSuccesses, prior[["betaPriorBeta"]] + data$nFailures, prior[["truncationLower"]], prior[["truncationUpper"]]) |
| 932 | + } |
| 933 | + |
914 | 934 |
|
915 | 935 |
|
916 | 936 | } else if (type == "prediction") {
|
|
924 | 944 |
|
925 | 945 | }
|
926 | 946 |
|
| 947 | + |
927 | 948 | dat <- data.frame(xStart = lCI, xEnd = uCI, g = "custom", coverage = coverage, parameter = "theta")
|
928 | 949 | return(dat)
|
929 | 950 | }
|
|
0 commit comments