From c3ba5542b4fd5d87a559ea8edaaae17a444014d0 Mon Sep 17 00:00:00 2001 From: sisyphus-jasp Date: Sat, 7 Mar 2026 04:57:25 +0100 Subject: [PATCH] [jaspFactor] Add correlation matrix determinant as an assumption check output... --- R/exploratoryfactoranalysis.R | 31 ++++++++++++++++++++++++- inst/qml/common/PcaEfaOutputOptions.qml | 8 ++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/R/exploratoryfactoranalysis.R b/R/exploratoryfactoranalysis.R index 62b22bc7..c5187684 100644 --- a/R/exploratoryfactoranalysis.R +++ b/R/exploratoryfactoranalysis.R @@ -35,6 +35,7 @@ exploratoryFactorAnalysisInternal <- function(jaspResults, dataset, options, ... # output functions .efaKMOtest( modelContainer, dataset, options, ready) .efaBartlett( modelContainer, dataset, options, ready) + .efaCorrelationDeterminant(modelContainer, dataset, options, ready) .efaMardia( modelContainer, dataset, options, ready) .efaAntiImageCorrelation( modelContainer, dataset, options, ready) .efaGoodnessOfFitTable( modelContainer, dataset, options, ready) @@ -291,6 +292,35 @@ exploratoryFactorAnalysisInternal <- function(jaspResults, dataset, options, ... bartlettTable[["pval"]] <- bar[["p.value"]] } +.efaCorrelationDeterminant <- function(modelContainer, dataset, options, ready) { + if (!isTRUE(options[["correlationMatrixDeterminant"]]) || !is.null(modelContainer[["determinantTable"]])) return() + + determinantTable <- createJaspTable(gettext("Correlation Matrix Determinant")) + determinantTable$dependOn("correlationMatrixDeterminant") + determinantTable$addColumnInfo(name = "determinant", title = gettext("Determinant"), type = "number", format = "sf:4") + determinantTable$position <- 0.25 + modelContainer[["determinantTable"]] <- determinantTable + + if (!ready) return() + + if (any(options$variables.types %in% c("ordinal", "nominal")) && options[["baseDecompositionOn"]] == "polyTetrachoricCorrelationMatrix") { + varTypes <- options$variables.types + vars <- options$variables + scales <- vars[varTypes == "scale"] + ordinals <- vars[varTypes == "ordinal"] + nominals <- vars[varTypes == "nominal"] + polyTetraCor <- psych::mixedCor(dataset, c = scales, p = ordinals, d = nominals) + corMatrix <- polyTetraCor$rho + } else { + if (options[["dataType"]] == "raw") + corMatrix <- stats::cor(dataset, use = "pairwise.complete.obs") + else + corMatrix <- stats::cov2cor(as.matrix(dataset)) + } + + determinantTable[["determinant"]] <- det(corMatrix) +} + .efaMardia <- function(modelContainer, dataset, options, ready) { @@ -969,4 +999,3 @@ exploratoryFactorAnalysisInternal <- function(jaspResults, dataset, options, ... } - diff --git a/inst/qml/common/PcaEfaOutputOptions.qml b/inst/qml/common/PcaEfaOutputOptions.qml index c7055ab0..38c900f0 100755 --- a/inst/qml/common/PcaEfaOutputOptions.qml +++ b/inst/qml/common/PcaEfaOutputOptions.qml @@ -124,6 +124,12 @@ Section label: qsTr("Bartlett's test") info: qsTr("Determines if the data correlation matrix is the identity matrix, meaning, if the variables are related or not. A significant result means the correlation matrix is unlike the identity matrix.") } + CheckBox { + visible: !pca + name: "correlationMatrixDeterminant" + label: qsTr("Correlation matrix determinant") + info: qsTr("Displays the determinant of the correlation matrix used for assessing multicollinearity before extraction.") + } CheckBox { name: "mardiaTest"; label: qsTr("Mardia's test") @@ -172,4 +178,4 @@ Section } } -} \ No newline at end of file +}