From 2163bf9d4e5f10f4456df74df02a75e98e8b39bd Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 Jan 2024 11:57:26 +0100 Subject: [PATCH] draft --- R/mcdonalds_omega.r | 61 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/R/mcdonalds_omega.r b/R/mcdonalds_omega.r index e1a8f9136..9090a5795 100644 --- a/R/mcdonalds_omega.r +++ b/R/mcdonalds_omega.r @@ -32,20 +32,55 @@ mcdonalds_omega <- function(x, ...) { #' @export -mcdonalds_omega.data.frame <- function(x, verbose = TRUE, ...) { - # remove missings - .data <- stats::na.omit(x) - - # we need at least two columns for Cronach's Alpha - if (is.null(ncol(.data)) || ncol(.data) < 2) { - if (verbose) { - insight::format_warning("Too few columns in `x` to compute McDonald's Omega.") - } - return(NULL) - } +mcdonalds_omega.data.frame <- function(x, ci = 0.95, verbose = TRUE, ...) { + varnames <- colnames(x) + q <- length(varnames) + N <- nrow(x) + loadingName <- paste0("a", 1:q) + errorName <- paste0("b", 1:q) + + model <- paste0("f1 =~ NA*", varnames[1], " + ") + loadingLine <- paste(paste0(loadingName, "*", varnames), collapse = " + ") + factorLine <- "f1 ~~ 1*f1\n" + errorLine <- paste(paste0(varnames, " ~~ ", errorName, "*", varnames), collapse = "\n") + sumLoading <- paste("loading :=", paste(loadingName, collapse = " + "), "\n") + sumError <- paste("error :=", paste(errorName, collapse = " + "), "\n") + relia <- "relia := (loading^2) / ((loading^2) + error) \n" + model <- paste0( + model, + loadingLine, + "\n", + factorLine, + errorLine, + "\n", + sumLoading, + sumError, + relia + ) + + fit <- lavaan::cfa(model, + data = attitude[, -1], missing = "ml", estimator = "mlr", se = "default" + ) + + lavaan::parameterEstimates(fit) - # Compute Cronbach's Alpha - dim(.data)[2] / (dim(.data)[2] - 1) * (1 - sum(apply(.data, 2, stats::var)) / stats::var(rowSums(.data))) + est <- 0.8274243 + se <- 0.05258224 + + crit <- stats::qnorm((1 + ci) / 2) + + logest <- log(est / (1 - est)) + logse <- se / (est * (1 - est)) + loglower <- logest - crit * logse + logupper <- logest + crit * logse + if (logupper < loglower) { + temp <- loglower + loglower <- logupper + loguppper <- temp + } + lower <- 1 / (1 + exp(-loglower)) + upper <- 1 / (1 + exp(-logupper)) + c(lower, upper) }