From e7c73c78dc585d9fe0392551a9c58a09721dc426 Mon Sep 17 00:00:00 2001 From: sisyphus-jasp Date: Sat, 7 Mar 2026 04:23:09 +0100 Subject: [PATCH] [jaspFactor] Enable ordinal variable support in Exploratory Factor Analysis by... --- R/principalcomponentanalysis.R | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/R/principalcomponentanalysis.R b/R/principalcomponentanalysis.R index 8489cf45..15fc14d6 100644 --- a/R/principalcomponentanalysis.R +++ b/R/principalcomponentanalysis.R @@ -55,6 +55,25 @@ principalComponentAnalysisInternal <- function(jaspResults, dataset, options, .. # Preprocessing functions ---- +.pcaAndEfaCoerceToNumeric <- function(x, variableType = NULL) { + + xNumeric <- suppressWarnings(as.numeric(as.character(x))) + conversionIntroducedNA <- any(is.na(xNumeric) & !is.na(x)) + + isTypeCategorical <- !is.null(variableType) && variableType %in% c("ordinal", "nominal") + isCategorical <- isTypeCategorical || is.factor(x) || is.ordered(x) + + if (conversionIntroducedNA && isCategorical) { + if (is.factor(x) || is.ordered(x)) { + return(as.numeric(x)) + } + + return(as.numeric(factor(x))) + } + + return(xNumeric) +} + .pcaAndEfaHandleData <- function(dataset, options, ready) { if (!ready) return() @@ -64,7 +83,11 @@ principalComponentAnalysisInternal <- function(jaspResults, dataset, options, .. if (options[["naAction"]] == "listwise") { dataset <- dataset[complete.cases(dataset), ] } - dataset[] <- lapply(dataset, function(x) as.numeric(as.character(x))) # the psych-package wants data to be numeric + variableTypes <- options[["variables.types"]] + dataset[] <- lapply(seq_along(dataset), function(i) { + currentType <- if (!is.null(variableTypes) && length(variableTypes) >= i) variableTypes[[i]] else NULL + .pcaAndEfaCoerceToNumeric(dataset[[i]], currentType) + }) return(dataset) } else { # if variance covariance matrix as input columnIndices <- sapply(options$variables, jaspBase:::columnIndexInData) + 1 # cpp starts at 0 @@ -822,5 +845,3 @@ principalComponentAnalysisInternal <- function(jaspResults, dataset, options, .. return() } - -