@@ -782,26 +782,36 @@ BANOVAcomputMatchedInclusion <- function(effectNames, effects.matrix, interactio
782
782
# no errors, proceed normally and complete the table
783
783
784
784
logsumbfs <- logSumExp(logbfs + logprior )
785
- internalTable [[" P(M|data)" ]] <- exp(logbfs + logprior - logsumbfs )
785
+ logPostProbModel <- logbfs + logprior - logsumbfs
786
+ internalTable [[" P(M|data)" ]] <- exp(logPostProbModel )
786
787
787
- nmodels <- nrow(internalTable )
788
- for (i in seq_len(nmodels )) {
789
- internalTable [i , " BFM" ] <- logbfs [i ] - logSumExp(logbfs [- i ]) + log(nmodels - 1L )
790
- }
788
+ logNumPostOdds <- logPostProbModel
789
+ logDenPostOdds <- log1mexp(logNumPostOdds )
790
+ logNumPriorOdds <- logprior
791
+ logDenPriorOdds <- log1mexp(logNumPriorOdds )
792
+ internalTable [[" BFM" ]] <- logNumPostOdds - logDenPostOdds + logDenPriorOdds - logNumPriorOdds
791
793
792
794
} else {
793
795
# create table excluding failed models
794
796
795
797
idxGood <- ! is.na(logbfs )
796
798
widxGood <- which(idxGood )
797
- logsumbfs <- logSumExp(logbfs [idxGood ])
798
- internalTable [[" P(M|data)" ]] <- exp(logbfs - logsumbfs )
799
799
800
- nmodels <- sum(idxGood )
800
+ # normalize the prior w.r.t the non-failed models
801
+ logpriorSubset <- logprior [idxGood ]
802
+ logpriorSubset <- logpriorSubset - logSumExp(logpriorSubset )
803
+
804
+ logsumbfs <- logSumExp(logbfs [idxGood ] + logpriorSubset )
805
+ logPostProbModel <- logbfs [idxGood ] + logpriorSubset - logsumbfs
806
+ internalTable [widxGood , " P(M|data)" ] <- exp(logPostProbModel )
807
+
808
+ logNumPostOdds <- logPostProbModel
809
+ logDenPostOdds <- log1mexp(logNumPostOdds )
810
+ logNumPriorOdds <- logpriorSubset
811
+ logDenPriorOdds <- log1mexp(logNumPriorOdds )
812
+ internalTable [widxGood , " BFM" ] <- logNumPostOdds - logDenPostOdds + logDenPriorOdds - logNumPriorOdds
813
+
801
814
widxBad <- which(! idxGood )
802
- for (i in widxGood ) {
803
- internalTable [[" BFM" ]][i ] <- logbfs [i ] - logSumExp(logbfs [- c(i , widxBad )]) + log(nmodels - 1L )
804
- }
805
815
806
816
internalTable [widxBad , " P(M|data)" ] <- NaN
807
817
internalTable [widxBad , " BFM" ] <- NaN
@@ -2832,6 +2842,17 @@ BANOVAcomputMatchedInclusion <- function(effectNames, effects.matrix, interactio
2832
2842
return (interactions.matrix )
2833
2843
}
2834
2844
2845
+ # ' Accurately compute log(1 - exp(x))
2846
+ # '
2847
+ # ' @param x numeric value or vector
2848
+ # '
2849
+ # ' @details See https://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf
2850
+ # '
2851
+ log1mexp <- function (x ) {
2852
+ a0 <- - 0.69314718055994528623 # log(1 / 2)
2853
+ ifelse(x < a0 , log1p(- exp(x )), log(- expm1(x )))
2854
+ }
2855
+
2835
2856
# Model prior ----
2836
2857
.BANOVAcomputePriorModelProbs <- function (models , nuisance , options ) {
2837
2858
0 commit comments