diff --git a/DESCRIPTION b/DESCRIPTION
index c4db8c65..caa1cbd3 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -19,7 +19,9 @@ Imports:
jaspGraphs,
LaplacesDemon,
lme4,
+ ltm,
MASS,
+ moments,
psych,
mirt
Remotes:
diff --git a/NAMESPACE b/NAMESPACE
index 24c60671..90fbba43 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -6,6 +6,7 @@ export(raterAgreement)
export(standardErrorOfMeasurement)
export(unidimensionalReliabilityBayesian)
export(unidimensionalReliabilityFrequentist)
+export(classicalTestTheory)
importFrom(jaspBase,.quitAnalysis)
importFrom(jaspBase,.readDataSetToEnd)
importFrom(jaspBase,createJaspContainer)
diff --git a/R/classicaltesttheory.R b/R/classicaltesttheory.R
new file mode 100755
index 00000000..9298fc18
--- /dev/null
+++ b/R/classicaltesttheory.R
@@ -0,0 +1,367 @@
+#
+# Copyright (C) 2013-2023 University of Amsterdam
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+
+classicalTestTheory <- function(jaspResults, dataset, options, ...) {
+ dataset <- .cttReadData(dataset, options)
+ ready <- .cttReady(options)
+
+ # Create the summary table
+ .cttSummaryTable(dataset, options, jaspResults, ready, position = 1)
+
+ # Create the descriptives table
+ .cttDescriptivesTable(dataset, options, jaspResults, ready, position = 3)
+
+ # Create the Cronbachs alpha table
+ .cttAlphaTable(dataset, options, jaspResults, ready, position = 5)
+
+ # Create the item statistics table
+ .cttItemStatisticsTable(dataset, options, jaspResults, ready, position = 7)
+
+ # Create the histogram of test scores
+ .cttHistogram(dataset, options, jaspResults, ready, position = 9)
+
+ # Create the difficulty and discrimination plot
+ .cttDiscrimination(dataset, options, jaspResults, ready, position = 11)
+
+ # Create the correlation heatmap
+ .cttHeatmap(dataset, options, jaspResults, ready, position = 13)
+}
+
+.cttReadData <- function(dataset, options) {
+ variables <- unlist(options[["items"]])
+ variables <- variables[variables != ""]
+ dataset <- jaspBase::excludeNaListwise(dataset, variables)
+ .hasErrors(dataset,
+ type = c("infinity", "observations"),
+ all.target = c(options[["items"]], options[["covariates"]]),
+ observations.amount = paste0("< ", nrow(dataset))
+ )
+ return(dataset)
+}
+
+.cttReady <- function(options) {
+ ready <- length(options[["items"]]) > 1 && all(unlist(options[["items"]]) != "")
+ return(ready)
+}
+
+.cttDeps <- function(type = "none") {
+ deps <- c("items", "customMaxScore", "tableCronbachsAlphaCI")
+ return(deps)
+}
+
+.cttState <- function(dataset, options, jaspResults) {
+ if (!is.null(jaspResults[["state"]])) {
+ return(jaspResults[["state"]]$object)
+ }
+ p <- try({
+ items <- dataset[, unlist(options[["items"]]), drop = FALSE]
+ if (!options[["customMaxScore"]]) {
+ maxScores <- apply(items, 2, max)
+ } else {
+ maxScores <- items[1, ]
+ items <- items[-1, ]
+ }
+ sumScores <- rowSums(items)
+ maxScore <- sum(maxScores)
+ descriptives <- data.frame(
+ items = length(options[["items"]]),
+ n = nrow(items),
+ min = min(sumScores, na.rm = TRUE),
+ max = max(sumScores, na.rm = TRUE),
+ mean = mean(sumScores, na.rm = TRUE),
+ median = median(sumScores, na.rm = TRUE),
+ sd = sd(sumScores, na.rm = TRUE),
+ skew = moments::skewness(sumScores, na.rm = TRUE),
+ kurt = moments::kurtosis(sumScores, na.rm = TRUE)
+ )
+ rir <- alpha <- numeric(length(options[["items"]]))
+ for (i in seq_along(options[["items"]])) {
+ rir[i] <- cor(items[, i], rowSums(items[, -i, drop = FALSE]))
+ if (ncol(items) > 2) {
+ alpha[i] <- ltm::cronbach.alpha(items[, -i, drop = FALSE])[["alpha"]]
+ } else {
+ alpha[i] <- NA
+ }
+ }
+ itemInfo <- data.frame(
+ item = unlist(options[["items"]]),
+ score = as.numeric(colMeans(items)),
+ sd = as.numeric(apply(items, 2, sd)),
+ rit = as.numeric(apply(items, 2, function(x) cor(x, rowSums(items)))),
+ rir = rir,
+ p = as.numeric(colMeans(items) / maxScores),
+ alpha = alpha
+ )
+ result <- list()
+ result[["items"]] <- items
+ result[["avgP"]] <- mean(itemInfo[["p"]], na.rm = TRUE)
+ result[["avgRit"]] <- mean(itemInfo[["rit"]], na.rm = TRUE)
+ result[["avgRir"]] <- mean(itemInfo[["rir"]], na.rm = TRUE)
+ result[["maxScore"]] <- maxScore
+ result[["maxScores"]] <- maxScores
+ result[["sumScores"]] <- sumScores
+ result[["descriptives"]] <- descriptives
+ result[["itemInfo"]] <- itemInfo
+ result[["cronbach"]] <- ltm::cronbach.alpha(items, CI = TRUE, probs = c((1 - options[["tableCronbachsAlphaCI"]]) / 2, options[["tableCronbachsAlphaCI"]] + (1 - options[["tableCronbachsAlphaCI"]]) / 2))
+ })
+ if (jaspBase:::isTryError(p)) {
+ jaspBase:::.quitAnalysis(gettextf("An error occurred in the analysis: %1$s", jaspBase:::.extractErrorMessage(p)))
+ }
+ jaspResults[["state"]] <- createJaspState(result)
+ jaspResults[["state"]]$dependOn(options = .cttDeps())
+ return(jaspResults[["state"]]$object)
+}
+
+.cttSummaryTable <- function(dataset, options, jaspResults, ready, position) {
+ if (options[["explanatoryText"]]) {
+ text <- createJaspHtml(gettext("
Explanatory Text: Classical Test Theory Classical Test Theory (CTT) is a framework for assessing and understanding the reliability and validity of psychological and educational tests. It suggests that an observed test score is composed of two components: the true score (the actual ability being measured) and noise (random variability in test scores). CTT focuses on quantifying and separating these components to evaluate the quality and consistency of a test."))
+ text$position <- position
+ text$dependOn(options = "explanatoryText")
+ jaspResults[["tableSummaryText"]] <- text
+ }
+ if (!is.null(jaspResults[["tableSummary"]])) {
+ return()
+ }
+ # Table
+ tb <- createJaspTable(title = gettext("Test Summary"))
+ tb$position <- position + 1
+ tb$addColumnInfo(name = "items", title = gettext("Items"), type = "integer")
+ tb$addColumnInfo(name = "n", title = gettext("Respondents"), type = "integer")
+ tb$addColumnInfo(name = "avgp", title = gettext("Avg. difficulty (P)"), type = "number")
+ tb$addColumnInfo(name = "avgrit", title = gettext("Avg. ritem-total "), type = "number")
+ tb$addColumnInfo(name = "avgrir", title = gettext("Avg. ritem-rest "), type = "number")
+ tb$dependOn(options = .cttDeps())
+ jaspResults[["tableSummary"]] <- tb
+ if (!ready) {
+ tb$addFootnote(gettext("The maximum possible test score is ...."))
+ return()
+ }
+ state <- .cttState(dataset, options, jaspResults)
+ tb[["items"]] <- state[["descriptives"]][["items"]]
+ tb[["n"]] <- state[["descriptives"]][["n"]]
+ tb[["avgp"]] <- state[["avgP"]]
+ tb[["avgrit"]] <- state[["avgRit"]]
+ tb[["avgrir"]] <- state[["avgRir"]]
+ tb$addFootnote(gettextf("The maximum possible test score is %1$s.", state[["maxScore"]]))
+}
+
+.cttDescriptivesTable <- function(dataset, options, jaspResults, ready, position) {
+ if (options[["explanatoryText"]] && options[["tableDescriptives"]]) {
+ text <- createJaspHtml(gettext("Explanatory Text: Descriptive Statistics The table below provides descriptive statistics the test scores (i.e., sum of item scores). It includes information about the lowest and highest recorded test score, the average (mean), the middle point (median), a measure of how spread out the scores are (standard deviation), and two measures that describe the shape of the score distribution (skewness and kurtosis)."))
+ text$position <- position
+ text$dependOn(options = c("explanatoryText", "tableDescriptives"))
+ jaspResults[["tableDescriptivesText"]] <- text
+ }
+ if (!is.null(jaspResults[["tableDescriptives"]]) || !options[["tableDescriptives"]]) {
+ return()
+ }
+ tb <- createJaspTable(title = gettext("Descriptive Statistics of Sum Scores"))
+ tb$position <- position + 1
+ tb$addColumnInfo(name = "min", title = gettext("Min."), type = "number")
+ tb$addColumnInfo(name = "max", title = gettext("Max."), type = "number")
+ tb$addColumnInfo(name = "mean", title = gettext("Mean"), type = "number")
+ tb$addColumnInfo(name = "median", title = gettext("Median"), type = "number")
+ tb$addColumnInfo(name = "sd", title = gettext("Std. dev"), type = "number")
+ tb$addColumnInfo(name = "skew", title = gettext("Skewness"), type = "number")
+ tb$addColumnInfo(name = "kurt", title = gettext("Kurtosis"), type = "number")
+ tb$dependOn(options = c(.cttDeps(), "tableDescriptives"))
+ jaspResults[["tableDescriptives"]] <- tb
+ if (!ready) {
+ return()
+ }
+ state <- .cttState(dataset, options, jaspResults)
+ tb[["min"]] <- state[["descriptives"]][["min"]]
+ tb[["max"]] <- state[["descriptives"]][["max"]]
+ tb[["mean"]] <- state[["descriptives"]][["mean"]]
+ tb[["median"]] <- state[["descriptives"]][["median"]]
+ tb[["sd"]] <- state[["descriptives"]][["sd"]]
+ tb[["skew"]] <- state[["descriptives"]][["skew"]]
+ tb[["kurt"]] <- state[["descriptives"]][["kurt"]]
+}
+
+.cttAlphaTable <- function(dataset, options, jaspResults, ready, position) {
+ if (options[["explanatoryText"]] && options[["tableCronbachsAlpha"]]) {
+ text <- createJaspHtml(gettextf("Explanatory Text: Test Reliability Cronbach's %1$s is a way to quantify how reliable (i.e., consistent) a test is. It tells us if all the questions in the test are measuring the same construct. This helps to understand if the test is consistent and if it is a good measure of what it is supposed to measure. When interpreting Cronbach's %1$s for a test, a high %1$s value (i.e., close to 1) indicates good internal consistency, suggesting that the test items are reliably measuring the same construct. On the other hand, a low %1$s value (i.e., close to 0) may suggest that some items in the assessment are not contributing to the overall measurement consistency and might need revision or removal. A rule of thumb is that a 'good' test has at least an %1$s value of 0.8.", "\u03B1"))
+ text$position <- position
+ text$dependOn(options = c("explanatoryText", "tableCronbachsAlpha"))
+ jaspResults[["tableCronbachsAlphaText"]] <- text
+ }
+ if (!is.null(jaspResults[["tableCronbachsAlpha"]]) || !options[["tableCronbachsAlpha"]]) {
+ return()
+ }
+ tb <- createJaspTable(title = gettext("Test Reliability"))
+ tb$position <- position + 1
+ tb$addColumnInfo(name = "alpha", title = gettextf("Cronbach's %1$s", "\u03B1"), type = "number")
+ overtitle <- gettextf("%1$s%% Confidence interval", round(options[["tableCronbachsAlphaCI"]] * 100, 3))
+ tb$addColumnInfo(name = "alpha_lower", title = gettext("Lower"), type = "number", overtitle = overtitle)
+ tb$addColumnInfo(name = "alpha_upper", title = gettext("Upper"), type = "number", overtitle = overtitle)
+ tb$dependOn(options = c(.cttDeps(), "tableCronbachsAlpha"))
+ jaspResults[["tableCronbachsAlpha"]] <- tb
+ if (!ready) {
+ return()
+ }
+ if (length(options[["items"]]) < 2) {
+ tb$addFootnote(gettext("There must be at least two items to compute Cronbach's alpha."))
+ return()
+ }
+ state <- .cttState(dataset, options, jaspResults)
+ tb[["alpha"]] <- state[["cronbach"]][["alpha"]]
+ tb[["alpha_lower"]] <- as.numeric(state[["cronbach"]][["ci"]][1])
+ tb[["alpha_upper"]] <- as.numeric(state[["cronbach"]][["ci"]][2])
+}
+
+.cttItemStatisticsTable <- function(dataset, options, jaspResults, ready, position) {
+ if (options[["explanatoryText"]] && options[["tableItemStatistics"]]) {
+ text <- createJaspHtml(gettextf("Explanatory Text: Item Information In educational testing and assessment, several statistics can evaluate the performance and quality of test items. These statistics help us understand how well each question or item is working and contributing to the overall quality of the test. Let's break down these important concepts in a straightforward manner:\n\n1. Avg. Score: This is the typical score that people get on a specific test item. It gives us an idea of how well test-takers are performing on that particular question.\n2. Std. dev: Standard deviation is a measure of how much individual scores on a test item vary from the average score. It helps us see how consistent or spread out the scores are for that item.\n3. Difficulty (P): Difficulty refers to how hard or easy a test item is for the test-takers. We estimate this by looking at the average score that people achieve on the item, and then we divide it by the range of possible scores. Essentially, it helps us understand if the item is generally difficult or not.\n4. ritem-total , ritem-rest : These correlations indicate how well a specific test item relates to the overall test score and how it relates to the rest of the test items. In simple terms, they show how closely linked the item is to the overall performance and to the other questions in the test.\n5. %1$s if removed: Cronbach's %1$s is a measure of the internal consistency or reliability of a test. The column represents what happens to the reliability of the test when a particular item is removed. It helps us assess how important or unimportant a specific question is for the overall reliability of the test.", "\u03B1"))
+ text$position <- position
+ text$dependOn(options = c("explanatoryText", "tableItemStatistics"))
+ jaspResults[["tableItemStatisticsText"]] <- text
+ }
+ if (!is.null(jaspResults[["tableItemStatistics"]]) || !options[["tableItemStatistics"]]) {
+ return()
+ }
+ tb <- createJaspTable(title = gettext("Item Information"))
+ tb$position <- position + 1
+ tb$addColumnInfo(name = "item", title = gettext("Item"), type = "string")
+ tb$addColumnInfo(name = "score", title = gettext("Avg. score"), type = "number")
+ tb$addColumnInfo(name = "sd", title = gettext("Std. dev"), type = "number")
+ tb$addColumnInfo(name = "p", title = gettext("Difficulty (P)"), type = "number")
+ tb$addColumnInfo(name = "rit", title = gettext("ritem-total "), type = "number")
+ tb$addColumnInfo(name = "rir", title = gettext("ritem-rest "), type = "number")
+ tb$addColumnInfo(name = "alpha", title = gettextf("%1$s if removed", "\u03B1"), type = "number")
+ tb$dependOn(options = c(.cttDeps(), "tableItemStatistics"))
+ jaspResults[["tableItemStatistics"]] <- tb
+ if (!ready) {
+ return()
+ }
+ state <- .cttState(dataset, options, jaspResults)
+ tb[["item"]] <- state[["itemInfo"]][["item"]]
+ tb[["score"]] <- state[["itemInfo"]][["score"]]
+ tb[["sd"]] <- state[["itemInfo"]][["sd"]]
+ tb[["p"]] <- state[["itemInfo"]][["p"]]
+ tb[["rit"]] <- state[["itemInfo"]][["rit"]]
+ tb[["rir"]] <- state[["itemInfo"]][["rir"]]
+ tb[["alpha"]] <- state[["itemInfo"]][["alpha"]]
+}
+
+.cttHistogram <- function(dataset, options, jaspResults, ready, position) {
+ if (options[["explanatoryText"]] && options[["plotHistogram"]]) {
+ text <- createJaspHtml(gettext("Explanatory Text: Histogram of Sum Scores The figure below displays a histogram of the test (i.e., sum) scores. It shows the frequencies of different total scores or sums of responses, which can help you understand the central tendency and variability of the data. Additionally, you can assess patterns or trends in the distribution, such as skewness or bimodality,"))
+ text$position <- position
+ text$dependOn(options = c("explanatoryText", "plotHistogram"))
+ jaspResults[["plotHistogramText"]] <- text
+ }
+ if (!is.null(jaspResults[["plotHistogram"]]) || !options[["plotHistogram"]]) {
+ return()
+ }
+ fg <- createJaspPlot(title = gettext("Histogram of Sum Scores"), height = 320, width = 480)
+ fg$position <- position + 1
+ fg$dependOn(options = c(.cttDeps(), "plotHistogram"))
+ jaspResults[["plotHistogram"]] <- fg
+ if (!ready) {
+ return()
+ }
+ state <- .cttState(dataset, options, jaspResults)
+ plotdata <- data.frame(x = seq_len(state[["maxScore"]]), y = rep(NA, state[["maxScore"]]))
+ for (i in seq_len(state[["maxScore"]])) {
+ plotdata$y[i] <- length(which(state[["sumScores"]] < i & state[["sumScores"]] >= (i - 1)))
+ }
+ xBreaks <- jaspGraphs::getPrettyAxisBreaks(plotdata$x, min.n = 4)
+ yBreaks <- jaspGraphs::getPrettyAxisBreaks(plotdata$y, min.n = 4)
+ p <- ggplot2::ggplot(data = plotdata, mapping = ggplot2::aes(x = x, y = y)) +
+ ggplot2::geom_col(fill = "lightgray", col = "black") +
+ ggplot2::scale_x_continuous(name = gettext("Sum Score"), breaks = xBreaks, limits = range(xBreaks)) +
+ ggplot2::scale_y_continuous(name = gettext("Counts"), breaks = yBreaks, limits = range(yBreaks)) +
+ jaspGraphs::geom_rangeframe() +
+ jaspGraphs::themeJaspRaw()
+ fg$plotObject <- p
+}
+
+.cttDiscrimination <- function(dataset, options, jaspResults, ready, position) {
+ if (options[["explanatoryText"]] && options[["plotItems"]]) {
+ text <- createJaspHtml(gettext("Explanatory Text: Difficulty and Discrimination Plot The figure below displays a bar chart of the item difficulty (measured by P) and discrimination (measured by ritem-total or Rit). This figure shows which items were the easiest to answer (left) and which items were the most difficult to answer (right)."))
+ text$position <- position
+ text$dependOn(options = c("explanatoryText", "plotItems"))
+ jaspResults[["plotItemsText"]] <- text
+ }
+ if (!is.null(jaspResults[["plotItems"]]) || !options[["plotItems"]]) {
+ return()
+ }
+ fg <- createJaspPlot(title = gettext("Item Difficulty and Discrimination Plot"), height = 320, width = 750)
+ fg$position <- position
+ fg$dependOn(options = c(.cttDeps(), "plotItems"))
+ jaspResults[["plotItems"]] <- fg
+ if (!ready) {
+ return()
+ }
+ state <- .cttState(dataset, options, jaspResults)
+ plotdata <- data.frame(
+ x = factor(rep(options[["items"]], 2)),
+ y = c(state[["itemInfo"]][["p"]], state[["itemInfo"]][["rit"]]),
+ type = c(rep(gettext("Difficulty (P)"), length(options[["items"]])), rep(gettext("Discrimination (Rit)"), length(options[["items"]])))
+ )
+ plotdata$x <- factor(plotdata$x, levels = plotdata$x[order(subset(plotdata$y, plotdata$type == gettext("Difficulty (P)")))])
+ xxName <- gettext("difficulty")
+ yBreaks <- jaspGraphs::getPrettyAxisBreaks(c(0, plotdata$y), min.n = 4)
+ xName <- gettextf("Item (ordered by %1$s)", xxName)
+ p <- ggplot2::ggplot(data = plotdata, mapping = ggplot2::aes(x = x, y = y, fill = type)) +
+ ggplot2::geom_col(position = ggplot2::position_dodge(0.75), col = "black", width = 0.75) +
+ ggplot2::scale_x_discrete(name = xName) +
+ ggplot2::scale_y_continuous(name = NULL, breaks = yBreaks, limits = range(yBreaks)) +
+ ggplot2::scale_fill_manual(name = NULL, values = c("firebrick", "dodgerblue")) +
+ jaspGraphs::geom_rangeframe() +
+ jaspGraphs::themeJaspRaw(legend.position = "top") +
+ ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 45, hjust = 1, vjust = 1, size = 12))
+ fg$plotObject <- p
+}
+
+.cttHeatmap <- function(dataset, options, jaspResults, ready, position) {
+ if (options[["explanatoryText"]] && options[["plotCorrelationHeatmap"]]) {
+ text <- createJaspHtml(gettext("Explanatory Text: Correlation Heatmap A correlation heat map displays Pearson correlations between item scores. The Pearson correlation coefficient describes linear correlation between two items. Positive correlations are shown in blue, while negative correlations are shown in red."))
+ text$position <- position
+ text$dependOn(options = c("explanatoryText", "plotCorrelationHeatmap"))
+ jaspResults[["plotCorrelationHeatmapText"]] <- text
+ }
+ if (!is.null(jaspResults[["plotCorrelationHeatmap"]]) || !options[["plotCorrelationHeatmap"]]) {
+ return()
+ }
+ fg <- createJaspPlot(title = gettext("Item Correlation Heatmap"), height = 40 * length(options[["items"]]), width = 40 * length(options[["items"]]) + 100)
+ fg$position <- position + 1
+ fg$dependOn(options = c(.cttDeps(), "plotCorrelationHeatmap", "plotCorrelationHeatmapShowValues"))
+ jaspResults[["plotCorrelationHeatmap"]] <- fg
+ if (!ready) {
+ return()
+ }
+ state <- .cttState(dataset, options, jaspResults)
+ plotdata <- as.data.frame(cor(state[["items"]]))
+ plotdata$row <- rownames(plotdata)
+ plotdata <- reshape2::melt(plotdata, id.var = "row")
+ colnames(plotdata) <- c("row", "col", "value")
+ plotdata$row <- factor(plotdata$row, levels = options[["items"]])
+ plotdata$col <- factor(plotdata$col, levels = options[["items"]])
+ p <- ggplot2::ggplot(data = plotdata, mapping = ggplot2::aes(x = col, y = row, fill = value)) +
+ ggplot2::geom_raster() +
+ ggplot2::scale_x_discrete(name = NULL) +
+ ggplot2::scale_y_discrete(name = NULL) +
+ ggplot2::scale_fill_gradient2(name = NULL, low = "#721A1D", mid = "white", high = "#322C89", limits = c(-1, 1)) +
+ jaspGraphs::geom_rangeframe() +
+ jaspGraphs::themeJaspRaw(legend.position = "right")
+ if (options[["plotCorrelationHeatmapShowValues"]]) {
+ p <- p + ggplot2::geom_text(label = round(plotdata$value, 2))
+ }
+ fg$plotObject <- p
+}
diff --git a/inst/Description.qml b/inst/Description.qml
index 713fce22..51483e68 100644
--- a/inst/Description.qml
+++ b/inst/Description.qml
@@ -54,6 +54,11 @@ Description
qml: "StandardErrorOfMeasurement.qml"
func: "standardErrorOfMeasurement"
}
+ Analysis
+ {
+ title: qsTr("Classical Test Theory")
+ func: "classicalTestTheory"
+ }
Separator {}
diff --git a/inst/qml/classicalTestTheory.qml b/inst/qml/classicalTestTheory.qml
new file mode 100755
index 00000000..64c989b7
--- /dev/null
+++ b/inst/qml/classicalTestTheory.qml
@@ -0,0 +1,139 @@
+//
+// Copyright (C) 2013-2018 University of Amsterdam
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public
+// License along with this program. If not, see
+// .
+//
+
+import QtQuick
+import QtQuick.Layouts
+import JASP
+import JASP.Controls
+
+Form
+{
+ info: qsTr("Classical Test Theory (CTT) is a traditional framework for analyzing test scores. It focuses on observed scores as the primary measure of an individual's ability and assumes that these scores consist of a true score and measurement error. CTT provides simple reliability indices, such as Cronbach's alpha, to assess the consistency of test scores but doesn't account for item characteristics or the latent ability of individuals, limiting its ability to address more complex assessments.")
+
+ VariablesForm
+ {
+ AvailableVariablesList
+ {
+ name: "variablesList"
+ info: qsTr("Select the variables to be analyzed.")
+ }
+
+ AssignedVariablesList
+ {
+ name: "items"
+ title: qsTr("Item Scores")
+ allowedColumns: ["scale"]
+ info: qsTr("Select the variables representing item scores for the analysis.")
+ }
+ }
+
+ Group
+ {
+ title: qsTr("Data")
+
+ CheckBox
+ {
+ name: "customMaxScore"
+ text: qsTr("First row is maximum item score")
+ info: qsTr("Check this if the first row in your data represents maximum item scores.")
+ }
+ }
+
+ Column
+ {
+ spacing: 20 * preferencesModel.uiScale
+
+ Group
+ {
+ title: qsTr("Display")
+
+ CheckBox
+ {
+ name: "explanatoryText"
+ text: qsTr("Explanatory text")
+ info: qsTr("Include explanatory text in the report.")
+ }
+ }
+
+ Group
+ {
+ title: qsTr("Tables")
+
+ CheckBox
+ {
+ name: "tableDescriptives"
+ text: qsTr("Descriptive statistics")
+ info: qsTr("Generate a table of descriptive statistics for the test (i.e., sum) scores.")
+ }
+
+ CheckBox
+ {
+ name: "tableCronbachsAlpha"
+ text: qsTr("Test reliability")
+ info: qsTr("Calculate test reliability using Cronbach's Alpha.")
+
+ CIField
+ {
+ name: "tableCronbachsAlphaCI"
+ text: qsTr("Confidence interval")
+ info: qsTr("Specify the confidence interval for Cronbach's Alpha.")
+ }
+ }
+
+ CheckBox
+ {
+ name: "tableItemStatistics"
+ text: qsTr("Item information")
+ info: qsTr("Generate a table of item-level statistics.")
+ }
+ }
+
+ Group
+ {
+ title: qsTr("Plots")
+
+ CheckBox
+ {
+ name: "plotHistogram"
+ text: qsTr("Histogram of sum scores")
+ info: qsTr("Create a histogram of the test (i.e., sum) scores.")
+ }
+
+ CheckBox
+ {
+ name: "plotItems"
+ text: qsTr("Item difficulty and discrimination")
+ info: qsTr("Generate a plot showing the item difficulty and discrimination parameters.")
+ }
+
+ CheckBox
+ {
+ name: "plotCorrelationHeatmap"
+ text: qsTr("Item correlations")
+ info: qsTr("Generate a heatmap of correlations between item scores.")
+
+ CheckBox
+ {
+ name: "plotCorrelationHeatmapShowValues"
+ text: qsTr("Display values")
+ info: qsTr("Display correlation values in the heatmap.")
+ }
+ }
+ }
+ }
+}
diff --git a/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-1.svg b/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-1.svg
new file mode 100644
index 00000000..2c0dc749
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-1.svg
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+2
+4
+6
+8
+10
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+10
+20
+30
+40
+50
+Sum Score
+Counts
+histogram-of-sum-scores-1
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-2.svg b/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-2.svg
new file mode 100644
index 00000000..540c337a
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-2.svg
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+1
+2
+3
+4
+5
+6
+7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+5
+10
+15
+20
+Sum Score
+Counts
+histogram-of-sum-scores-2
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-3.svg b/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-3.svg
new file mode 100644
index 00000000..5a759b4b
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-3.svg
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+1
+2
+3
+4
+5
+6
+7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+20
+40
+60
+80
+100
+Sum Score
+Counts
+histogram-of-sum-scores-3
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-4.svg b/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-4.svg
new file mode 100644
index 00000000..9a4fea69
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/histogram-of-sum-scores-4.svg
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+1
+2
+3
+4
+5
+
+
+
+
+
+
+
+
+
+
+
+
+
+0
+20
+40
+60
+80
+100
+Sum Score
+Counts
+histogram-of-sum-scores-4
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-1.svg b/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-1.svg
new file mode 100644
index 00000000..be6f5a6a
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-1.svg
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Q1
+Q2
+Q3
+Q4
+Q5
+Q6
+Q7
+Q8
+Q9
+Q10
+Q11
+Q12
+Q13
+Q14
+Q15
+Q16
+Q17
+Q18
+Q19
+Q20
+Q21
+Q22
+Q23
+Q24
+Q25
+Q26
+Q27
+Q28
+Q29
+Q30
+Q31
+Q32
+Q33
+Q34
+Q35
+Q36
+Q37
+Q38
+Q39
+Q40
+Q41
+Q42
+Q43
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Q1
+Q2
+Q3
+Q4
+Q5
+Q6
+Q7
+Q8
+Q9
+Q10
+Q11
+Q12
+Q13
+Q14
+Q15
+Q16
+Q17
+Q18
+Q19
+Q20
+Q21
+Q22
+Q23
+Q24
+Q25
+Q26
+Q27
+Q28
+Q29
+Q30
+Q31
+Q32
+Q33
+Q34
+Q35
+Q36
+Q37
+Q38
+Q39
+Q40
+Q41
+Q42
+Q43
+
+
+
+
+
+
+
+
+
+
+
+
+
+-1.0
+-0.5
+0.0
+0.5
+1.0
+item-correlation-heatmap-1
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-2.svg b/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-2.svg
new file mode 100644
index 00000000..1fe93278
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-2.svg
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Q1
+Q2
+Q3
+Q4
+Q5
+Q6
+Q7
+Q8
+Q9
+Q10
+Q11
+Q12
+Q13
+Q14
+Q15
+Q16
+Q17
+Q18
+Q19
+Q20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Q1
+Q2
+Q3
+Q4
+Q5
+Q6
+Q7
+Q8
+Q9
+Q10
+Q11
+Q12
+Q13
+Q14
+Q15
+Q16
+Q17
+Q18
+Q19
+Q20
+
+
+
+
+
+
+
+
+
+
+
+
+
+-1.0
+-0.5
+0.0
+0.5
+1.0
+item-correlation-heatmap-2
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-3.svg b/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-3.svg
new file mode 100644
index 00000000..9f17241e
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-3.svg
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1a
+1b
+1c
+1d
+1e
+1f
+2a
+2b
+2c
+2d
+2e
+2f
+3a
+3b
+3c
+3d
+3e
+3f
+4a
+4b
+4c
+4d
+4e
+5a
+5b
+5c
+5d
+5e
+5f
+5g
+5h
+5i
+6a
+6b
+6c
+6d
+7a
+7b
+7c
+7d
+7e
+7f
+7g
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1a
+1b
+1c
+1d
+1e
+1f
+2a
+2b
+2c
+2d
+2e
+2f
+3a
+3b
+3c
+3d
+3e
+3f
+4a
+4b
+4c
+4d
+4e
+5a
+5b
+5c
+5d
+5e
+5f
+5g
+5h
+5i
+6a
+6b
+6c
+6d
+7a
+7b
+7c
+7d
+7e
+7f
+7g
+
+
+
+
+
+
+
+
+
+
+
+
+
+-1.0
+-0.5
+0.0
+0.5
+1.0
+item-correlation-heatmap-3
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-4.svg b/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-4.svg
new file mode 100644
index 00000000..c0cc3a45
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/item-correlation-heatmap-4.svg
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1a
+1b
+1c
+1d
+1e
+1f
+1g
+1h
+1i
+2a
+2b
+2c
+2d
+2e
+2f
+3a
+3b
+3c
+3d
+3e
+3f
+3g
+4a
+4b
+4c
+4d
+4e
+4f
+5a
+5b
+5c
+5d
+5e
+5f
+5g
+6a
+6b
+6c
+6d
+6e
+6f
+7a
+7b
+7c
+7d
+7e
+7f
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1a
+1b
+1c
+1d
+1e
+1f
+1g
+1h
+1i
+2a
+2b
+2c
+2d
+2e
+2f
+3a
+3b
+3c
+3d
+3e
+3f
+3g
+4a
+4b
+4c
+4d
+4e
+4f
+5a
+5b
+5c
+5d
+5e
+5f
+5g
+6a
+6b
+6c
+6d
+6e
+6f
+7a
+7b
+7c
+7d
+7e
+7f
+
+
+
+
+
+
+
+
+
+
+
+
+
+-1.0
+-0.5
+0.0
+0.5
+1.0
+item-correlation-heatmap-4
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-1.svg b/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-1.svg
new file mode 100644
index 00000000..678d5955
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-1.svg
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0.0
+0.2
+0.4
+0.6
+0.8
+1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Q40
+Q41
+Q30
+Q5
+Q42
+Q32
+Q24
+Q2
+Q20
+Q31
+Q43
+Q28
+Q29
+Q11
+Q21
+Q17
+Q12
+Q19
+Q23
+Q9
+Q35
+Q6
+Q27
+Q33
+Q22
+Q36
+Q26
+Q18
+Q3
+Q34
+Q8
+Q10
+Q1
+Q7
+Q38
+Q14
+Q37
+Q25
+Q13
+Q16
+Q4
+Q15
+Q39
+Item (ordered by difficulty)
+
+
+
+
+
+
+Difficulty (P)
+Discrimination (Rit)
+item-difficulty-and-discrimination-plot-1
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-2.svg b/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-2.svg
new file mode 100644
index 00000000..224b3619
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-2.svg
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+0.0
+0.2
+0.4
+0.6
+0.8
+1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Q8
+Q17
+Q10
+Q13
+Q3
+Q4
+Q12
+Q18
+Q7
+Q2
+Q5
+Q11
+Q19
+Q20
+Q14
+Q16
+Q6
+Q15
+Q1
+Q9
+Item (ordered by difficulty)
+
+
+
+
+
+
+Difficulty (P)
+Discrimination (Rit)
+item-difficulty-and-discrimination-plot-2
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-3.svg b/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-3.svg
new file mode 100644
index 00000000..85a87c4a
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-3.svg
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-0.2
+0.0
+0.2
+0.4
+0.6
+0.8
+1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4e
+1e
+5g
+7e
+6a
+5f
+2b
+5h
+4d
+7d
+5a
+3d
+7f
+5b
+5d
+1a
+5e
+4c
+3b
+3f
+5i
+4a
+6d
+7g
+1d
+1f
+6b
+1c
+2a
+2c
+2d
+3a
+2f
+3e
+6c
+2e
+3c
+7a
+5c
+7c
+7b
+4b
+1b
+Item (ordered by difficulty)
+
+
+
+
+
+
+Difficulty (P)
+Discrimination (Rit)
+item-difficulty-and-discrimination-plot-3
+
+
diff --git a/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-4.svg b/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-4.svg
new file mode 100644
index 00000000..04aff7ed
--- /dev/null
+++ b/tests/testthat/_snaps/classicaltesttheory/item-difficulty-and-discrimination-plot-4.svg
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-0.2
+0.0
+0.2
+0.4
+0.6
+0.8
+1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6f
+5d
+3g
+4b
+3b
+6c
+5g
+7f
+7e
+3d
+6d
+2f
+7d
+6a
+4a
+6b
+3e
+6e
+7c
+1a
+4c
+5e
+2e
+4e
+4f
+3a
+5b
+5a
+2a
+1b
+2b
+7b
+4d
+1i
+3c
+2c
+1f
+2d
+3f
+1h
+5f
+1c
+1d
+1e
+1g
+5c
+7a
+Item (ordered by difficulty)
+
+
+
+
+
+
+Difficulty (P)
+Discrimination (Rit)
+item-difficulty-and-discrimination-plot-4
+
+
diff --git a/tests/testthat/binary.csv b/tests/testthat/binary.csv
new file mode 100644
index 00000000..111849b9
--- /dev/null
+++ b/tests/testthat/binary.csv
@@ -0,0 +1,100 @@
+ID,Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10,Q11,Q12,Q13,Q14,Q15,Q16,Q17,Q18,Q19,Q20,Q21,Q22,Q23,Q24,Q25,Q26,Q27,Q28,Q29,Q30,Q31,Q32,Q33,Q34,Q35,Q36,Q37,Q38,Q39,Q40,Q41,Q42,Q43
+1,1,0,0,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0
+2,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,0,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,0,0
+3,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,0,1,0,0,1,0,0,1,0,1,1,1,1,0,0,1,1
+4,0,0,1,1,1,0,1,0,0,1,1,1,0,1,1,0,1,0,1,1,0,1,0,0,0,1,1,1,0,0,0,0,1,0,0,1,0,1,1,0,0,1,0
+5,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1,0,1,1,1,0,0,1,1
+6,1,0,1,1,0,1,0,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0
+7,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,1,0,0,0,0
+8,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1
+9,1,0,0,1,1,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,0,0,0,1,0,1,0,1,1,0,1,0,0,1,0,1,1,1
+10,1,0,0,0,0,1,1,1,0,1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0
+11,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,1,0,1,1,0,1,0,1,0,1,1,1,0,0,0,1,0
+12,0,0,1,1,0,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1
+13,0,0,1,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0,0,1,0,1,1,0,1,1,1,1,0,1,1,1
+14,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0
+15,1,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,1,0,1,1,0,0,0,0,1,1,1,1,1,0,1,1,1,0,1,0,0
+16,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1,1,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,1,1,0,0,1,1,0,1,1,0,0,1
+17,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,0,1,1,0,0,1,0,0,1,0
+18,1,0,1,0,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1
+19,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1
+20,1,1,0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,1,0,0,1,1,1,0,1,0,0,0,0,0,0
+21,0,0,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0
+22,1,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,0,0,0,1,0,0,1,1,1,1,1,0,0,1
+23,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0
+24,0,1,1,1,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,0,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,0
+25,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0
+26,1,0,0,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0,0,1,0,0
+27,1,0,0,1,0,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,0,0
+28,1,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,0,0,0,0
+29,1,0,1,1,1,0,0,1,1,0,1,1,1,0,0,1,0,0,1,0,0,0,1,1,0,1,1,1,1,0,0,0,0,0,1,0,1,1,1,0,0,1,1
+30,1,0,1,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,0,1,1,0,0,1,1,0,0,0,0,1,1,1,1,1,0,1,0
+31,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,1,0,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,1
+32,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,0,1,1
+33,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0
+34,0,0,1,1,0,1,0,0,1,1,1,1,0,1,1,1,1,0,0,1,0,1,1,0,0,0,1,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1
+35,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1
+36,1,1,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,1,0,1,1,1,1,0,0,1,0,1,1,1,1,0,0,1,0,1,1
+37,0,0,1,1,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1
+38,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,0
+39,1,1,0,1,0,0,0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,1,0,1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,0,0,1,1
+40,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,1,0,1,1,1,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,1
+41,1,0,1,1,0,0,1,0,0,1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,0,1,1,1,0,0,1,1
+42,1,0,1,0,0,0,1,1,1,0,0,0,1,0,1,1,1,1,0,1,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0
+43,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+44,0,1,0,1,0,1,0,1,1,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0
+45,1,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,0
+46,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,0,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,0,0
+47,0,1,0,1,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,0,1,0,0
+48,0,0,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,0,0,1,1
+49,1,0,1,1,0,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,0,1,0,1,0,1,1,1,0,1,1,1,0,0,0,1
+50,1,0,0,1,0,0,0,1,1,1,0,1,1,1,0,1,1,0,0,0,0,0,1,1,0,1,0,1,1,0,0,0,0,1,1,1,0,1,1,0,0,0,1
+51,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,1,1
+52,1,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,0,1,1,0,0,0,0,1,0,1,1,1,0,1,0,1,0,0,0,1
+53,1,1,1,1,0,0,1,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0
+54,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,0,0,1
+55,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0
+56,1,0,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,1,0,0,0,0,0,1,1,0,1,0,0,0,1,0,1,1,0,0,1,1,1,0,0,1,0
+57,1,0,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,1,0,1
+58,1,1,0,1,1,0,1,1,1,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0
+59,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+60,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,0,1,0,0,0,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,1,0
+61,1,0,1,1,0,0,1,1,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0
+62,0,1,1,1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0
+63,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1
+64,1,0,1,1,1,0,1,1,0,0,1,0,1,1,1,1,0,0,0,0,1,1,0,0,1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0
+65,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,1,1,1,0,0,1,0
+66,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0
+67,1,0,1,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,0,1,0,0,0,1,0,1,1,0,1,1,0,0,1,0
+68,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1
+69,0,0,0,1,0,0,0,1,1,1,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,0,0,1,0,0,0,0,1,1,0,0,1,0,1,0,1,0,0
+70,1,1,0,1,1,0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0
+71,1,0,1,1,0,1,0,0,0,1,0,0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,0,0,1,1,1,1,0,0,1,0
+72,1,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0
+73,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1
+74,1,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,1
+75,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,0
+76,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0
+77,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,1,0,0,0,0
+78,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1
+79,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,1,0,1,0,1,0,1,1,0,1,1,0,0,1,1,0,0,0,1
+80,0,0,0,1,1,0,1,1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,1,0,1,0,0,0
+81,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,1,1,0,0,1,1
+82,1,0,1,1,1,0,1,1,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,0,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1
+83,1,0,0,1,0,1,1,0,0,0,1,0,0,1,1,1,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
+84,1,1,1,1,0,0,1,0,0,1,1,1,1,1,0,1,1,1,0,0,0,0,1,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,1,0,0,0,1
+85,1,0,0,1,0,0,1,1,0,1,1,0,1,1,1,1,0,1,0,0,0,1,1,0,0,1,0,1,0,0,0,1,0,1,1,1,1,1,1,0,0,0,0
+86,0,1,0,0,0,1,0,0,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0
+87,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,1
+88,1,1,0,1,1,0,0,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,0,0,0,0
+89,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0
+90,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0
+91,1,0,1,0,1,0,1,1,0,0,1,0,1,1,1,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0
+92,0,0,1,0,0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,1,0,1,1,1,1,1,1,0,1,0,0,0,0
+93,1,0,0,0,0,0,1,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1
+94,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,0,1,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,0,1,1,1,1,1,0,0,0,0
+95,0,0,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0,0,1,0,1,0,0,0,1
+96,1,0,1,1,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,1,1,0,1,1,1
+97,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,0,1,0,1,0,1
+98,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,1,0,0,0,0,1,1,1,1,1,1,0,1,1,1
+99,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,0,1,1,0,1,0,1,0,1,1,1,0,0,0
diff --git a/tests/testthat/binary2.csv b/tests/testthat/binary2.csv
new file mode 100644
index 00000000..c78f7b9f
--- /dev/null
+++ b/tests/testthat/binary2.csv
@@ -0,0 +1,51 @@
+ID,Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10,Q11,Q12,Q13,Q14,Q15,Q16,Q17,Q18,Q19,Q20
+1,1,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,0,0,1,1
+2,1,0,0,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,0,0
+3,1,1,1,0,1,1,1,0,1,1,1,1,0,0,1,1,0,1,1,0
+4,0,0,0,1,0,1,1,0,1,0,1,0,0,1,0,1,0,0,0,1
+5,1,1,0,1,0,1,0,0,1,1,1,0,1,1,0,1,1,1,1,1
+6,1,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,0
+7,1,0,0,1,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,1
+8,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,0,1
+9,1,0,0,1,0,0,1,1,1,0,0,0,1,0,0,0,0,0,1,1
+10,1,0,0,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,0
+11,1,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,1,0,0
+12,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,1,0,1,0
+13,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1
+14,1,0,0,1,1,1,0,0,1,0,1,1,0,1,0,0,0,1,0,0
+15,1,1,1,0,1,0,0,1,1,0,1,1,1,0,1,0,1,0,1,0
+16,1,1,0,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,0,0
+17,1,0,0,1,1,1,1,0,0,0,1,0,1,1,1,1,0,1,1,1
+18,1,1,0,0,0,1,1,0,1,1,0,0,0,0,1,1,0,0,1,0
+19,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1
+20,1,1,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0
+21,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,0,0,1,1
+22,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,0
+23,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1
+24,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1
+25,1,0,0,1,1,1,0,1,1,0,0,0,0,0,1,1,0,0,1,1
+26,0,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1
+27,1,1,1,0,0,1,0,0,1,0,1,1,0,0,1,1,1,1,0,0
+28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0
+29,1,1,1,0,0,0,1,0,1,0,1,0,0,1,1,0,1,1,0,1
+30,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,1,0,1,1,1
+31,0,0,0,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0,0,1
+32,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,1
+33,0,0,1,0,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1
+34,0,0,0,1,0,0,1,0,1,0,1,0,0,1,0,0,0,0,1,1
+35,0,1,0,0,0,1,1,0,0,0,1,0,0,1,1,0,1,0,0,0
+36,1,1,1,1,1,1,1,0,1,1,0,1,0,1,1,1,0,1,0,1
+37,1,1,0,0,1,1,1,0,1,1,0,1,0,1,1,0,0,0,0,1
+38,1,0,1,0,1,0,1,0,1,0,0,1,1,1,1,1,0,1,1,0
+39,0,1,1,0,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1
+40,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1
+41,1,1,0,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,1,1
+42,1,1,1,0,1,1,1,0,1,0,1,1,0,1,1,1,1,0,1,1
+43,1,1,1,1,1,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0
+44,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,1,1,0,0,1
+45,1,0,0,0,1,0,1,0,1,1,1,0,0,0,1,1,0,0,0,0
+46,1,1,0,1,1,1,0,0,1,1,1,1,0,1,1,1,0,0,0,1
+47,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0
+48,1,1,0,0,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,1
+49,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0
+50,1,1,0,1,1,1,1,1,1,0,1,1,0,0,1,0,1,0,0,1
diff --git a/tests/testthat/scored.csv b/tests/testthat/scored.csv
new file mode 100755
index 00000000..9b2d48fe
--- /dev/null
+++ b/tests/testthat/scored.csv
@@ -0,0 +1,100 @@
+ID,1a,1b,1c,1d,1e,1f,2a,2b,2c,2d,2e,2f,3a,3b,3c,3d,3e,3f,4a,4b,4c,4d,4e,5a,5b,5c,5d,5e,5f,5g,5h,5i,6a,6b,6c,6d,7a,7b,7c,7d,7e,7f,7g
+1,2,1,3,2,1,1,0,2,1,0.5,2,0,2,0,1,0,1,4,1,2,3,2,2,1,1,1,2,0,0,0,0,1,0,2,5,2,1,3,1,2,0,3,3
+2,2,1,3,2,0,1,0,0,1,1,2,2,2,3,1,4,1,4,1,2,5,2,0,1,2,1,0,1,0,0,0,1,1,2,5,2,1,3,1,2,2,3,3
+3,0,1,0,2,0,0,2,0,0,1,1,2,2,3,1,4,1,4,1,2,5,0,0,1,2,1,1,1,0,0,3,0,0,2,5,0,1,3,1,0,0,1,3
+4,2,1,3,2,0,1,2,0,1,1,1,0,2,3,1,0,1,4,2,2,5,0,1,0,1,1,2,1,0,2,3,0,0,2,4,0,1,3,1,2,0,3,3
+5,2,1,3,2,0,1,2,2,1,0.5,2,2,2,2,1,4,1,4,1,2,5,2,0,1,1,1,2,1,2,0,3,1,0,2,5,2,0,3,1,2,0,3,3
+6,0,1,3,0,0,0,2,0,0,1,2,2,2,2,0,4,1,4,0,2,5,0,0,1,0,1,0,0,0,2,0,0,0,2,5,2,1,3,1,0,0,0,3
+7,0,1,3,2,0,1,2,0,1,1,2,2,0,3,1,0,1,4,2,2,3,2,1,0,2,1,2,1,0,0,3,0,0,2,3,0,1,3,1,0,0,1,3
+8,2,1,3,0,0,1,2,0,1,1,2,0,2,3,1,0,1,4,1,2,3,2,0,1,2,1,1,1,2,0,3,0,0,2,5,2,1,3,1,0,0,3,3
+9,2,1,3,2,0,1,2,2,1,1,2,2,2,0,1,4,1,4,1,2,5,0,0,0,0,1,2,0,0,0,0,1,0,0,5,2,1,3,1,2,0,3,0
+10,2,1,3,2,0,0,2,0,1,0.5,2,2,2,0,1,0,1,4,2,2,5,0,3,1,2,1,0,0,2,0,0,0,1,2,5,2,1,3,1,2,0,3,3
+11,2,1,3,2,0,1,2,0,1,1,2,2,2,3,1,0,1,0,1,2,3,0,0,1,2,1,2,1,0,0,3,1,1,2,5,2,1,3,1,0,0,3,3
+12,0,1,3,2,0,1,2,0,1,0.5,2,2,2,1,0,4,0,0,2,2,3,0,0,0,0,1,2,0,0,0,3,1,0,2,5,2,1,3,1,2,0,1,3
+13,2,1,3,2,0,0,2,0,1,1,2,2,2,3,1,0,1,4,2,2,4,2,0,1,2,1,2,1,2,0,3,0,0,2,5,2,1,3,1,0,0,3,3
+14,0,1,0,2,0,1,0,0,1,1,2,2,2,1,1,4,1,4,0,2,0,0,0,1,2,1,2,0,0,0,0,0,1,0,0,0,1,3,1,0,0,0,0
+15,0,1,3,2,0,0,2,0,0,1,2,2,2,0,1,4,1,4,0,2,5,2,0,0,0,1,0,1,0,0,3,1,0,2,5,2,1,3,1,0,0,0,3
+16,0,1,3,2,0,1,0,0,1,1,2,2,0,0,1,4,1,0,1,2,0,2,1,1,0,1,1,1,0,0,0,1,1,2,5,0,1,3,1,2,0,1,3
+17,2,1,3,2,0,1,2,2,1,0.5,2,0,2,2,1,4,1,4,2,2,3,2,0,1,2,1,1,1,2,0,0,1,0,2,5,2,1,3,1,2,0,3,3
+18,2,1,3,0,0,1,2,0,1,1,2,0,2,3,0,0,1,4,2,2,5,0,1,1,2,1,2,1,0,0,3,1,1,2,5,2,1,3,1,0,0,0,0
+19,0,1,3,2,0,0,2,2,0,1,2,2,2,2,1,0,1,4,2,2,5,2,0,1,0,0,0,0,0,0,0,1,0,2,5,2,1,3,1,0,2,0,3
+20,0,1,3,0,0,0,2,0,1,1,2,2,2,3,1,4,1,0,2,2,3,2,1,1,0,1,1,1,0,0,0,0,0,2,5,2,1,3,1,2,0,0,3
+21,2,1,3,0,0,1,2,0,1,1,2,2,2,3,0,0,0,4,2,2,4,2,0,1,2,1,2,1,2,0,3,0,0,2,5,2,1,3,1,0,0,3,3
+22,0,1,2,0,1,1,0,2,0,0,0,0,2,0,1,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,1,3,0,2,0,1,0
+23,0,1,3,0,0,1,2,2,1,1,2,2,2,0,1,4,1,4,2,2,5,0,0,0,1,1,2,0,2,2,3,0,1,2,5,2,1,3,1,2,2,0,3
+24,0,1,2,2,1,1,2,0,1,1,2,2,2,2,1,0,1,4,1,2,5,0,0,1,1,1,2,1,2,2,0,1,1,2,5,2,1,3,1,2,2,0,3
+25,2,1,3,2,1,1,2,0,1,1,2,2,2,1,1,0,1,4,1,2,5,0,0,0,0,1,2,1,0,0,3,1,0,2,5,2,1,3,1,2,0,0,3
+26,0,1,0,2,0,0,0,0,1,0,1,2,2,3,0,4,1,0,2,2,0,0,0,1,0,1,2,1,0,2,0,0,0,2,5,2,1,3,1,0,0,0,0
+27,2,1,0,2,0,1,0,0,1,1,1,2,2,3,1,4,1,0,1,2,4,2,0,0,2,1,1,0,0,0,2,1,0,2,5,0,0,3,1,0,0,0,3
+28,2,1,3,0,0,1,2,0,1,1,2,2,2,0,1,0,1,4,2,2,5,2,0,1,2,1,1,1,0,0,3,0,0,2,4,2,1,3,1,0,0,3,0
+29,0,1,3,2,0,1,2,2,0,1,2,0,0,0,0,0,0,0,1,2,0,0,0,0,2,0,2,1,0,0,0,0,1,2,5,0,0,3,1,2,0,0,0
+30,2,1,3,2,0,1,2,2,1,0,2,2,0,2,1,4,0,4,0,2,4,0,0,0,0,1,0,0,0,0,0,1,0,2,5,2,1,3,1,0,0,3,0
+31,2,1,0,0,0,1,2,0,1,1,2,0,2,3,1,4,1,0,1,2,4,0,0,0,1,1,1,0,0,0,0,0,1,2,5,0,1,3,1,2,0,0,3
+32,2,1,3,0,0,1,2,0,1,1,2,2,2,3,1,0,1,4,1,2,5,0,0,1,1,1,1,1,0,0,3,1,0,2,5,2,1,3,1,2,0,0,0
+33,2,1,0,2,0,1,2,0,1,1,2,2,0,3,1,0,1,4,1,2,5,2,0,0,1,1,1,1,0,0,0,1,0,2,5,2,1,3,1,2,2,0,0
+34,2,1,3,2,0,1,0,0,1,1,2,2,0,3,0,0,1,0,0,2,3,2,0,0,1,1,2,1,0,0,3,0,1,2,5,2,1,3,1,0,0,0,3
+35,0,1,3,2,0,1,2,2,1,0,2,2,2,3,1,4,1,4,2,2,0,0,2,1,2,1,2,0,0,2,2,1,0,0,0,2,1,3,1,2,0,0,3
+36,2,1,3,2,1,1,2,2,1,0.5,2,0,2,0,1,4,1,4,2,2,6,2,3,0,1,1,2,1,0,2,3,1,0,2,5,2,1,3,1,2,2,3,3
+37,2,1,3,0,0,1,0,0,1,1,2,0,2,3,1,0,1,4,0,2,5,0,0,1,2,1,2,1,0,0,3,1,0,2,5,2,1,3,1,0,2,3,0
+38,2,1,1,2,1,1,2,0,1,0.5,2,2,2,3,0,4,1,0,1,2,5,0,0,0,2,1,2,0,0,0,2,1,0,2,5,2,1,3,0,0,0,3,3
+39,0,1,2,0,0,1,2,2,0,0,0,2,0,0,1,0,0,0,1,2,5,0,0,0,0,1,1,0,0,0,0,1,0,2,0,0,1,0,1,2,2,0,0
+40,2,1,3,0,0,1,2,0,1,1,2,2,2,3,0,0,1,4,1,2,5,0,0,1,1,1,2,1,2,0,3,1,0,2,5,2,1,3,1,2,2,3,0
+41,0,1,3,2,1,1,2,0,1,1,2,2,2,3,1,0,1,4,2,2,5,0,0,0,0,1,2,1,0,0,3,1,0,2,0,2,1,3,1,2,0,0,3
+42,0,1,0,2,0,0,2,0,1,0,2,2,2,1,1,4,1,4,2,2,5,0,0,0,2,1,2,0,2,0,3,1,1,0,5,2,1,3,1,2,2,3,0
+43,2,1,3,0,0,1,2,0,1,0.5,2,2,2,2,1,0,1,4,2,2,6,0,0,1,1,1,2,1,0,0,0,1,1,2,5,2,1,3,1,2,0,0,3
+44,2,1,0,2,0,1,0,0,1,1,2,2,0,3,1,0,1,4,2,2,5,0,0,0,0,1,0,0,2,0,0,1,0,0,3,0,1,3,1,0,0,0,3
+45,2,1,3,2,0,1,2,0,1,1,2,2,2,3,0,0,1,4,0,2,5,0,0,0,0,1,2,1,0,0,3,1,0,2,5,2,1,3,1,2,0,0,3
+46,2,1,3,0,0,0,2,2,1,1,2,2,2,3,1,4,1,4,1,2,5,0,0,0,2,1,1,1,0,0,2,1,0,2,5,2,1,3,1,2,2,3,3
+47,2,1,3,2,0,1,2,2,1,1,2,2,2,2,1,4,1,4,2,2,0,2,0,0,1,1,0,0,0,0,0,0,0,2,4,2,1,3,1,0,0,3,3
+48,2,1,3,2,0,1,2,2,1,0.5,1,2,2,3,1,4,1,4,2,2,6,0,1,1,1,1,2,0,2,2,0,0,0,2,2,2,1,3,1,0,0,0,0
+49,0,1,3,2,0,0,2,2,0,1,2,2,2,0,1,0,1,4,2,2,4,0,3,0,0,1,1,0,0,0,0,0,1,2,5,2,0,3,1,0,0,0,0
+50,2,1,3,2,0,1,0,2,1,0.5,2,2,2,3,0,4,1,4,2,2,5,2,0,0,2,1,1,1,0,0,0,0,0,2,5,2,1,3,1,1,2,2,3
+51,2,1,0,2,0,1,2,0,0,1,2,2,2,3,1,0,1,4,2,2,5,0,0,1,2,1,1,0,2,0,0,1,0,0,5,0,1,0,1,0,0,1,3
+52,2,1,1,0,0,0,2,0,1,1,2,2,2,3,1,4,1,0,0,2,5,0,3,0,1,1,2,0,0,0,2,1,0,2,5,0,1,3,1,0,0,2,0
+53,2,1,1,2,0,1,2,2,1,1,1,0,2,2,1,0,1,4,2,2,3,2,0,1,2,1,1,1,2,0,0,1,0,2,5,2,1,3,1,0,0,3,3
+54,2,1,3,2,1,1,0,0,0,1,0,2,0,3,1,0,1,0,1,2,0,0,0,1,1,1,0,1,2,0,3,0,0,0,5,2,1,3,1,2,0,3,3
+55,0,1,3,2,0,1,2,0,1,1,2,2,2,3,1,4,1,4,1,2,5,0,0,0,1,1,0,0,0,0,0,0,1,2,5,0,1,3,0,0,0,3,3
+56,0,1,3,2,0,1,2,2,1,1,2,2,2,3,0,4,1,4,2,2,5,0,0,0,1,1,2,0,2,2,0,0,1,2,5,2,0,3,1,2,2,3,3
+57,2,1,3,2,0,1,2,0,1,1,2,0,2,1.5,1,0,1,4,1,2,3,2,0,1,2,1,0,1,0,0,3,0,0,2,5,2,1,3,1,0,0,3,3
+58,2,1,3,0,0,1,2,0,1,1,1,2,0,3,1,0,1,4,2,2,3,2,0,1,2,1,1,1,2,0,3,0,0,2,5,0,0,3,1,0,2,0,0
+59,2,1,1,2,1,1,2,0,1,1,2,2,2,3,1,0,1,0,2,2,5,2,0,1,2,1,1,1,2,0,3,1,0,2,5,2,0,3,1,0,0,3,0
+60,2,1,3,2,0,0,2,0,1,1,2,2,2,3,1,4,1,0,2,2,5,2,0,0,2,1,0,0,0,0,2,1,0,0,5,2,1,3,1,2,0,3,3
+61,0,1,3,2,1,1,2,2,1,1,2,2,2,3,1,4,1,4,2,2,5,2,1,0,2,1,1,0,0,0,3,1,0,2,5,2,1,3,1,2,2,3,3
+62,2,1,2,2,0,1,2,0,1,1,2,0,2,3,1,0,1,0,2,2,3,0,0,1,2,1,2,1,2,0,3,0,0,2,5,2,1,3,1,0,0,0,0
+63,2,1,2,2,0,1,2,2,1,1,2,2,2,3,1,4,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,5,0,1,3,1,0,0,1,0
+64,2,1,2,2,1,0,0,0,1,1,1,2,2,3,1,0,1,4,0,2,6,2,0,1,0,1,1,1,0,2,0,1,0,2,0,2,1,3,1,0,0,3,3
+65,0,1,1,2,0,1,2,0,1,1,2,2,2,2,1,4,1,4,0,2,5,0,0,0,1,1,1,1,0,2,0,1,0,2,5,0,1,3,1,0,0,1,3
+66,2,1,2,2,0,1,2,2,1,1,2,0,2,2,1,4,1,4,2,2,3,0,0,1,1,1,1,1,2,0,0,1,0,0,5,2,1,3,1,2,0,3,3
+67,2,1,3,2,0,0,2,0,1,0.5,2,0,2,2,1,4,1,4,2,2,5,0,0,0,0,1,0,1,2,0,3,1,1,2,5,0,1,3,1,0,2,3,3
+68,2,1,3,2,1,1,2,0,1,1,2,2,2,2,1,4,1,4,2,2,5,2,0,0,0,1,2,1,2,0,0,1,0,0,5,2,1,3,1,0,2,3,0
+69,0,1,3,2,0,0,2,0,0,1,2,2,0,2,1,0,1,0,2,2,5,2,0,0,0,1,0,1,0,0,0,1,0,2,5,2,1,3,1,2,0,0,0
+70,2,1,3,2,0,1,2,0,1,0.5,2,2,2,3,1,0,1,0,2,2,4,0,0,1,0,1,0,0,2,0,0,1,0,2,5,0,1,3,1,0,0,1,3
+71,0,1,0,2,1,1,0,2,1,1,2,2,2,2,1,0,1,4,2,2,0,2,0,0,2,1,1,1,0,0,0,1,1,2,5,2,1,3,1,0,0,1,3
+72,0,1,3,2,1,1,2,0,1,1,2,0,2,2,1,4,1,4,2,2,5,0,3,0,2,1,0,1,0,0,0,1,0,2,2,2,1,3,0,0,0,0,0
+73,2,1,2,2,0,0,0,0,0,0.5,2,2,0,2,1,0,1,0,0,0,0,2,0,0,0,1,0,1,0,0,0,1,0,0,5,2,1,3,1,0,0,2,3
+74,2,1,2,2,0,1,2,0,1,1,2,2,0,1,1,0,1,0,2,2,5,0,0,0,0,1,2,1,0,0,3,1,0,2,5,2,1,3,1,2,0,0,3
+75,0,1,3,0,1,1,2,0,1,1,2,2,2,1,1,4,1,4,1,2,5,0,0,1,0,1,2,1,0,0,0,1,0,2,5,2,1,3,1,0,0,3,3
+76,2,1,3,2,1,1,0,0,1,0.5,2,2,2,3,1,4,1,4,2,2,5,2,3,0,2,1,2,0,2,2,3,1,0,2,0,2,1,3,1,2,2,3,3
+77,2,1,1,0,0,1,0,0,1,1,2,2,0,2,1,0,0,0,2,2,5,0,0,0,2,1,0,1,2,2,0,1,1,0,5,2,1,3,0,2,0,3,3
+78,2,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+79,0,1,3,0,0,1,2,2,1,1,2,2,2,0,1,4,1,4,2,2,5,0,0,0,0,1,1,0,2,2,0,1,0,2,0,2,1,0,1,0,0,0,3
+80,0,1,3,2,0,0,0,0,0,0,1,2,0,0,1,0,1,0,2,2,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,3,1,0,0,3,0
+81,0,1,3,0,0,0,0,0,1,1,1,2,2,2,1,4,1,4,0,2,5,2,0,1,1,1,0,0,0,0,0,1,1,2,5,0,1,3,0,0,0,3,3
+82,0,1,0,0,0,1,2,2,0,1,1,2,0,2,1,0,0,0,0,2,3,0,3,1,2,0,0,0,0,0,0,0,0,0,5,0,1,3,1,2,2,3,0
+83,0,1,3,2,0,1,2,0,1,1,1,2,2,2,1,4,1,4,2,2,0,2,2,0,2,1,0,0,0,2,0,0,0,0,5,0,1,3,1,2,0,0,3
+84,0,1,3,2,0,0,2,2,0,1,2,2,2,2,1,0,0,0,2,2,5,0,0,0,2,1,2,1,0,0,0,1,1,2,5,0,1,3,1,0,2,1,3
+85,2,1,2,2,0,1,2,2,1,1,2,0,2,0,1,4,1,4,2,2,6,0,0,1,2,1,2,0,0,0,3,1,1,0,5,2,1,3,1,2,2,3,3
+86,0,1,3,2,0,1,2,2,1,1,2,2,2,0,1,4,1,4,1,2,0,0,0,0,0,1,2,1,0,0,3,1,1,0,5,2,1,3,1,0,0,0,3
+87,0,1,3,2,0,1,2,0,1,1,2,2,2,2,1,4,0,4,1,2,5,2,0,0,1,1,0,1,0,0,0,1,1,2,5,0,1,3,0,0,0,3,3
+88,2,1,3,2,0,1,2,2,1,0.5,2,2,2,0,1,4,1,4,2,2,5,2,0,0,2,1,2,0,0,0,2,1,0,0,5,2,1,3,1,2,0,1,3
+89,0,1,1,0,0,0,2,0,0,1,0,2,2,2,1,0,1,0,0,0,0,2,3,0,0,1,0,1,2,0,0,1,0,2,5,0,1,3,1,0,0,0,0
+90,0,1,2,2,0,0,0,2,1,1,2,2,2,2,1,4,1,4,2,2,5,0,0,1,2,1,2,0,2,2,3,1,1,0,5,2,1,3,1,2,2,3,3
+91,0,1,3,2,0,0,2,0,1,1,2,2,2,3,1,0,1,4,2,2,0,2,0,0,0,1,1,0,0,2,0,1,0,0,5,2,1,3,1,0,0,0,3
+92,0,1,2,0,0,1,2,0,0,1,2,2,0,2,1,0,1,0,0,0,3,2,0,1,0,1,0,1,0,0,0,0,1,0,5,0,1,3,1,0,0,3,3
+93,0,1,3,0,0,0,2,0,1,1,1,2,2,2,1,4,0,4,0,2,5,0,0,1,0,0,0,0,0,0,0,1,0,2,5,0,1,3,1,0,0,0,0
+94,2,1,3,2,0,0,2,2,1,1,2,2,2,3,1,0,0,0,2,2,5,0,0,1,2,1,1,1,2,2,0,1,0,2,5,2,1,3,1,2,2,3,3
+95,0,1,2,0,0,0,2,0,1,0.5,1,2,2,2,1,4,1,4,2,2,4,2,0,1,1,1,0,0,0,0,0,1,0,0,3,2,1,3,1,0,0,0,3
+96,0,1,0,0,0,0,2,0,0,0,0,2,2,0,1,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0
+97,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,0,0
+98,0,1,1,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,1,2,0,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+99,0,1,0,0,0,1,0,2,0,0,0,2,2,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0
diff --git a/tests/testthat/scored2.csv b/tests/testthat/scored2.csv
new file mode 100644
index 00000000..f5fd1513
--- /dev/null
+++ b/tests/testthat/scored2.csv
@@ -0,0 +1,74 @@
+ID,1a,1b,1c,1d,1e,1f,1g,1h,1i,2a,2b,2c,2d,2e,2f,3a,3b,3c,3d,3e,3f,3g,4a,4b,4c,4d,4e,4f,5a,5b,5c,5d,5e,5f,5g,6a,6b,6c,6d,6e,6f,7a,7b,7c,7d,7e,7f
+1,1,0,0,0,1,1,1,1,2,1.5,2,1,0,2,1,0,0,3,1,0,2,0,0,2,1,2,2,0,0,2,2,1,4,1,1,0,1,0,1,2,0,1,2,0,4,4,1
+2,1,1,1,1,1,0,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,2,2,0,0,1,0,0,0,0,2,0,0,1,2,0,0,0,0
+3,0,1,1,1,1,1,1,1,2,2,1,0,1,1,1,2,0,3,0,4,2,0,0,0,1,2,3,3,0,2,2,0,4,1,0,0,1,0,3,2,0,1,2,0,4,0,0
+4,1,1,1,1,1,0,1,1,2,1.5,1,1,1,3,1,2,0,3,0,4,2,0,2,0,1,2,2,3,2,2,2,0,0,1,0,1,1,0,1,0,0,1,2,2,1,0,1
+5,1,1,1,1,1,1,1,1,2,1,2,1,1,0,0,0,0,3,1,0,2,0,1,0,1,2,4,3,2,2,2,0,4,1,0,0,1,1.33,0,2,0,1,0,2,4,0,0
+6,0,1,1,1,1,1,1,1,2,0.5,2,1,1,3,0,2,0,0,1,0,2,0,0,0,1,2,3,0,0,0,2,0,0,1,1,0,0,0,2,0,0,1,0,0,1,0,0
+7,1,1,1,1,1,1,1,0.67,2,1.5,1,1,1,3,1,2,0,3,0,4,2,0,3,0,1,2,4,3,2,2,2,0,4,1,1,0,1,0.7,2,2,0,1,0,2,1,4,1
+8,1,1,1,1,1,1,1,0.67,2,1,2,1,1,3,0,2,0,1,0,0,2,0,3,2,1,2,4,3,2,0,2,0,0,1,0,0,0,1.5,1,2,0,1,0,2,4,0,2
+9,0,0,1,1,1,1,1,1,2,2,2,1,1,3,0,2,0,3,0,0,2,0,3,0,0,2,4,3,2,0,2,0,4,1,0,0,1,2,3,0,0,1,0,0,4,0,0
+10,0,1,1,1,1,1,1,1,2,1.5,2,0,0,2,0,2,0,3,0,4,2,2,1,2,1,0,4,3,2,2,2,1,4,1,2,1,1,0,2,2,0,1,2,0,2,4,1
+11,1,1,1,1,1,1,1,1,2,1,2,1,1,3,1,2,0,3,0,4,2,2,0,2,1,2,1,3,1,2,2,0,4,1,1,0,0,0.67,1,2,0,1,2,2,4,0,0
+12,0,0,1,1,1,1,1,1,1,1.5,2,1,0,2,1,2,0,3,0,4,2,0,0,0,0,2,0,0,1,2,2,0,4,1,2,1,1,0,1,2,0,1,2,0,0,0,0
+13,1,1,1,1,1,0,1,1,1,1,2,1,1,3,1,2,1,3,1,4,2,0,0,0,0,0,4,3,2,2,2,1,0,1,2,0,0,0,0,0,0,1,2,2,0,0,1
+14,1,1,1,1,1,1,1,1,2,1.5,1,1,1,0,0,2,1,1,0,4,2,0,2,0,1,2,1,0,2,2,2,0,4,1,1,1,1,0,0,0,0,1,2,0,4,4,2
+15,1,0,1,1,1,1,1,0.67,2,1.5,2,1,1,3,1,2,1,3,1,4,2,2,3,0,1,2,4,3,2,2,2,2,4,1,2,1,1,2,3,2,0,1,2,2,4,0,2
+16,0,1,1,1,1,1,1,1,2,2,1,1,1,3,1,0,0,3,1,4,2,0,0,2,1,0,0,0,2,0,2,0,0,1,0,1,1,0,3,0,0,1,0,0,1,0,0
+17,1,1,1,1,1,1,1,0.67,2,1.5,1,1,1,3,1,2,1,3,1,4,2,2,3,0,1,2,4,3,2,2,2,0,4,1,2,1,1,1.5,1,2,1,1,2,0,4,4,2
+18,0,0,0,0,1,0,1,1,2,1.5,2,1,1,3,1,2,1,3,1,4,2,0,3,0,1,2,4,3,0,0,2,0,4,1,1,1,0,0.67,3,0,0,1,2,2,0,4,0
+19,1,1,1,1,1,1,1,1,2,1.5,1,1,1,2,1,2,1,3,0,4,2,2,3,0,1,2,2,3,2,2,2,0,4,1,1,1,0,0.33,3,2,0,1,2,2,2,4,2
+20,1,1,1,1,1,1,1,1,2,1.5,2,1,1,3,1,2,0,3,0,4,2,0,3,2,1,2,4,3,2,2,2,0,0,1,0,0,0,0.67,2,0,0,1,2,2,4,4,0
+21,0,1,1,1,1,1,1,1,1,1.5,2,1,1,3,0,0,0,1,0,0,2,0,3,2,0,2,3,0,2,2,2,1,4,1,2,1,1,1.5,2,2,0,1,2,2,2,4,1
+22,1,1,1,1,1,1,1,0.67,0,1.5,1,1,1,0,0,2,0,1,0,0,0,0,1,0,1,0,2,0,0,2,2,0,4,1,0,1,0,0,2,0,1,1,2,2,1,0,1
+23,1,1,1,1,1,1,1,1,2,1,2,1,1,3,1,2,1,3,1,4,2,2,3,0,1,2,2,3,2,2,2,1,4,1,2,1,1,1.5,2,2,1,1,0,2,1,0,2
+24,0,1,1,1,1,1,1,1,2,1.5,2,1,1,3,0,2,0,3,0,4,2,0,3,0,0,2,1,3,2,2,2,0,4,1,0,0,0,0.67,3,2,0,1,2,2,0,4,2
+25,1,0,1,1,1,0,1,1,1,2,1,1,1,0,0,2,0,3,0,0,2,0,2,0,1,0,0,3,1,2,2,2,4,1,0,0,1,0.67,0,2,0,1,2,2,0,0,0
+26,1,1,1,1,1,1,1,0.67,2,2,2,1,0,1,1,2,0,3,1,0,2,0,3,2,1,2,4,0,1,2,2,1,0,1,0,0,0,1.33,3,0,0,1,2,2,3,0,0
+27,0,1,1,1,1,1,1,1,1,1.5,1,1,1,3,1,0,1,3,0,4,2,0,1,0,1,2,4,3,1,2,2,0,4,1,0,0,1,0,2,2,0,1,2,2,4,0,2
+28,0,1,1,1,1,1,0,1,2,1,2,0,1,2,1,2,0,0,0,4,0,0,0,0,1,2,4,3,1,0,2,2,0,1,0,0,0,0.67,1,0,0,1,2,0,0,0,0
+29,1,1,1,1,1,1,1,0.67,2,1.5,2,1,1,3,1,2,1,3,1,4,2,0,3,2,0,2,4,3,2,0,2,1,4,1,0,1,0,1.5,2,2,0,1,2,2,0,4,2
+30,1,1,1,1,1,1,1,0.67,1,1.5,2,1,1,3,0,2,0,3,1,4,2,2,0,0,1,2,4,3,2,2,2,0,4,1,0,1,0,0.67,0,0,0,1,0,2,2,4,1
+31,1,0,1,1,1,1,1,1,2,1.5,2,1,1,3,0,2,0,1,0,4,2,0,3,2,1,2,4,3,1,2,2,1,4,1,2,1,0,0.7,2,0,1,1,2,2,4,0,1
+32,1,0,1,1,1,1,1,0.33,1,2,2,1,1,0,0,2,0,3,1,4,0,0,2,0,1,2,1,3,0,2,2,0,4,1,0,1,1,0,2,2,0,1,2,2,4,4,0
+33,1,1,1,1,1,1,1,0.33,2,1.5,2,1,1,2,1,2,1,2,1,0,0,0,3,0,0,2,2,3,2,0,2,0,0,1,0,0,0,0,2,2,0,1,2,0,2,0,0
+34,1,1,1,1,1,1,1,1,2,1.5,1,1,1,3,0,0,0,3,1,0,2,0,0,0,0,0,4,0,0,2,2,0,0,1,0,0,1,0,1,2,0,1,2,0,2,0,1
+35,1,1,1,1,1,1,1,1,2,1.5,2,1,1,3,0,2,1,3,1,4,2,0,2,0,0,2,2,0,2,2,2,0,0,1,2,1,1,0,2,0,0,1,0,2,3,0,1
+36,1,0,1,1,1,0,1,0.67,2,1.5,1,1,1,1,0,0,0,3,1,0,2,0,0,0,0,2,4,3,1,0,2,0,0,1,1,0,0,0.33,2,2,0,1,2,0,1,4,0
+37,1,1,1,1,1,1,1,1,2,1.5,1,1,1,3,1,2,1,3,0,4,2,2,3,2,1,2,4,3,2,2,2,0,4,1,2,1,1,1.33,2,2,1,1,2,2,4,4,2
+38,0,1,1,1,1,1,1,1,2,2,0,1,1,2,1,0,0,3,0,0,2,2,0,0,0,2,4,3,2,2,2,0,4,1,0,0,1,0.67,2,2,0,1,2,2,1,4,1
+39,1,1,1,1,0,1,1,1,2,2,2,1,1,3,0,2,1,3,1,4,2,0,3,2,0,2,4,3,1,0,2,0,4,1,0,1,1,0.7,1,2,0,1,2,2,3,0,0
+40,0,1,1,1,1,1,1,1,2,1,1,1,1,3,0,2,0,3,1,0,0,0,3,0,1,0,3,0,2,0,2,0,4,1,1,0,1,0,0,0,0,1,2,0,0,0,0
+41,0,1,1,1,1,1,1,0.67,0,1.5,2,1,1,3,1,2,0,1,0,0,2,0,3,0,1,2,2,3,1,2,2,0,4,1,0,0,1,0.7,0,0,0,1,2,0,0,0,0
+42,0,0,1,1,1,1,1,1,2,1.5,1,1,1,3,1,2,1,2,1,4,2,0,3,0,1,2,2,0,1,2,2,0,4,1,1,0,0,0,2,2,0,1,2,2,3,4,1
+43,1,1,1,1,1,1,1,1,2,1.5,2,1,1,3,1,0,0,3,0,0,2,0,1,2,0,2,4,3,2,2,2,0,4,1,1,1,0,0,3,2,0,1,2,2,4,4,1
+44,1,1,1,0,1,1,1,1,2,2,2,1,1,3,0,0,0,3,0,0,2,0,1,2,0,2,2,3,2,2,2,0,4,0,0,0,1,0,0,0,0,1,2,0,0,0,0
+45,0,1,1,1,1,1,1,0.67,1,1.5,2,1,1,2,0,2,0,3,0,4,0,0,0,2,1,2,3,3,2,2,2,0,4,1,0,0,0,0.67,1,0,0,1,0,2,4,0,0
+46,1,1,1,1,1,1,1,1,2,2,1,1,1,3,0,0,0,3,0,4,2,2,2,0,0,2,2,3,2,2,2,0,4,1,2,1,1,0,0,0,0,1,2,2,4,4,0
+47,1,1,1,1,1,1,1,1,2,1,1,1,1,3,0,2,0,3,0,4,2,0,3,0,0,2,2,3,2,2,2,0,4,1,1,1,0,0,1,2,0,1,2,2,4,4,1
+49,1,1,1,1,1,1,1,1,2,1.5,1,1,1,3,1,0,0,3,0,0,2,0,0,0,0,2,4,3,1,0,2,0,4,1,0,0,1,0,0,0,0,1,2,0,4,4,1
+50,1,1,1,1,1,1,1,1,2,2,1,1,1,0,0,0,0,1,1,0,2,0,3,2,0,2,2,3,2,2,2,0,4,1,0,1,0,0,2,2,0,1,2,2,3,4,0
+51,1,0,1,1,1,1,1,1,2,1,1,0,0,1,0,2,0,3,1,4,2,0,1,2,0,2,0,3,2,2,2,0,0,1,1,0,1,1.7,0,2,0,1,0,2,4,0,2
+52,1,1,1,1,1,1,1,1,1,1.5,1,0,1,1,1,0,0,1,0,0,2,0,0,0,1,2,2,0,1,2,2,0,4,1,0,0,0,1.33,1,0,0,1,2,0,4,0,1
+53,0,0,1,1,1,1,1,0.67,0,1.5,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0
+54,1,1,1,1,1,1,1,1,2,2,2,0,1,3,1,2,0,3,1,4,2,2,1,2,1,2,2,0,2,0,2,0,0,1,1,1,1,0.67,3,2,0,1,0,2,4,4,1
+55,0,0,1,1,1,1,1,1,1,1.5,0,1,1,2,0,0,0,3,0,0,2,0,1,0,1,2,4,3,2,0,2,0,4,1,0,1,1,0.7,0,0,0,1,2,2,0,0,0
+56,1,0,0,1,1,1,1,0.67,1,1.5,1,1,0,0,0,2,0,3,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0
+57,0,1,1,1,1,0,1,0.67,1,1.5,0,1,1,3,1,2,0,3,1,4,2,0,1,0,1,0,2,3,2,2,2,0,0,1,0,1,0,0,2,2,0,1,2,2,1,0,1
+58,1,1,1,1,1,1,1,1,2,1,2,1,1,3,1,2,1,3,1,4,2,2,3,2,1,2,4,3,2,2,2,1,4,1,2,1,1,2,3,2,0,1,2,2,4,4,2
+59,0,1,1,1,1,1,1,1,2,2,2,0,1,0,1,0,0,3,0,0,2,0,0,0,1,2,2,0,0,0,2,0,0,1,0,0,1,1.33,1,0,0,1,2,0,1,0,0
+60,0,1,1,1,1,1,1,1,2,1.5,2,1,1,3,1,2,1,3,1,4,2,0,3,0,1,2,4,3,2,2,2,1,4,1,0,1,0,1.5,3,2,1,1,2,2,2,4,2
+61,0,1,1,1,1,1,1,0.67,2,1.5,2,1,1,0,0,2,0,3,0,4,2,0,3,0,1,0,3,3,2,0,2,0,0,0,0,0,0,0.67,3,2,0,1,0,0,1,0,0
+62,1,1,1,1,1,1,1,1,2,1,2,1,1,0,0,2,1,3,0,4,2,0,1,0,1,2,4,3,2,2,2,0,4,1,2,1,0,1.33,3,2,0,1,2,0,0,0,0
+63,0,1,1,1,1,1,1,0.67,2,2,2,1,1,0,1,2,1,3,1,4,2,2,3,0,1,2,4,3,2,2,2,0,4,1,1,1,0,0.67,2,2,1,1,2,2,4,0,1
+64,1,0,1,1,1,1,1,1,2,2,2,1,1,3,1,2,0,2,0,4,2,0,1,0,1,2,3,3,1,2,2,0,4,1,0,1,1,1.5,0,2,1,1,2,2,0,4,2
+65,1,1,1,1,1,1,1,0.67,2,2,2,1,1,2,1,0,1,3,1,0,2,0,3,2,1,2,4,3,2,0,2,1,4,1,2,0,0,1.5,3,2,0,1,2,2,4,4,0
+66,1,1,1,1,1,1,1,1,2,1.5,2,1,1,3,0,2,0,3,1,4,2,0,3,0,1,2,4,3,2,2,0.67,0,4,1,1,1,1,0.67,0,2,0,1,2,2,0,0,1
+67,1,0,1,1,1,1,1,1,2,1.5,2,1,1,3,1,2,0,3,0,4,2,0,3,0,1,2,4,3,2,2,2,0,4,1,1,0,1,1.33,0,2,0,1,2,2,4,4,0
+68,1,1,1,1,0,1,1,1,0,1.5,2,1,1,3,1,2,1,3,1,0,2,0,3,0,1,2,3,3,1,2,2,1,4,1,0,1,1,2,3,2,0,1,2,2,4,4,1
+69,1,1,1,1,0,1,1,0.67,1,1.5,2,1,1,0,1,2,1,3,1,4,2,2,1,0,0,2,4,3,2,0,2,0,4,1,0,1,1,0.7,2,2,0,1,2,2,0,0,0
+70,1,1,1,1,1,1,1,1,2,2,2,1,1,2,0,2,0,3,1,4,2,0,1,0,0,2,3,0,2,2,2,1,0,1,0,1,0,0.67,1,2,0,1,0,2,1,0,0
+71,0,1,1,1,1,1,1,0.67,2,1.5,2,1,1,3,0,0,1,3,0,0,2,0,3,0,1,2,4,3,2,2,2,0,4,1,0,1,1,0,2,0,0,1,2,2,3,4,0
+72,1,1,1,1,1,0,1,0.67,2,1.5,2,1,1,3,0,2,0,3,0,4,2,0,0,0,0,2,2,3,2,2,2,0,4,1,2,1,1,1.5,2,2,0,1,2,2,2,0,0
+73,1,1,1,1,1,1,1,1,2,1.5,2,1,1,3,1,2,0,3,1,4,2,2,1,0,1,2,4,3,2,2,2,0,0,1,2,1,0,0.67,3,2,0,1,2,2,4,4,1
+74,1,1,1,1,1,1,1,1,1,2,1,1,1,2,0,2,0,3,1,4,2,0,3,0,1,0,4,0,1,2,2,0,0,1,2,1,1,0,0,2,0,1,2,0,0,0,0
diff --git a/tests/testthat/test-classicaltesttheory.R b/tests/testthat/test-classicaltesttheory.R
new file mode 100644
index 00000000..70e0ef8d
--- /dev/null
+++ b/tests/testthat/test-classicaltesttheory.R
@@ -0,0 +1,533 @@
+context("Classical Test Theory")
+
+# Consistency test 1, file: binary.csv #########################################
+
+options <- analysisOptions("classicalTestTheory")
+options$items <- c("Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", "Q12", "Q13", "Q14", "Q15", "Q16", "Q17", "Q18", "Q19", "Q20", "Q21", "Q22", "Q23", "Q24", "Q25", "Q26", "Q27", "Q28", "Q29", "Q30", "Q31", "Q32", "Q33", "Q34", "Q35", "Q36", "Q37", "Q38", "Q39", "Q40", "Q41", "Q42", "Q43")
+options$customMaxScore <- FALSE
+options$plotCorrelationHeatmap <- TRUE
+options$plotHistogram <- TRUE
+options$plotItems <- TRUE
+options$tableCronbachsAlpha <- TRUE
+options$tableDescriptives <- TRUE
+options$tableItemStatistics <- TRUE
+set.seed(1)
+results <- runAnalysis("classicalTestTheory", "binary.csv", options)
+
+test_that("Item Correlation Heatmap plot matches", {
+ plotName <- results[["results"]][["plotCorrelationHeatmap"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "item-correlation-heatmap-1")
+})
+
+test_that("Histogram of Sum Scores plot matches", {
+ plotName <- results[["results"]][["plotHistogram"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "histogram-of-sum-scores-1")
+})
+
+test_that("Item Difficulty and Discrimination Plot matches", {
+ plotName <- results[["results"]][["plotItems"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "item-difficulty-and-discrimination-plot-1")
+})
+
+test_that("Test Reliability table results match", {
+ table <- results[["results"]][["tableCronbachsAlpha"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(0.889547959988228, 0.846508008323858, 0.916134580141315)
+ )
+})
+
+test_that("Descriptive Statistics of Sum Scores table results match", {
+ table <- results[["results"]][["tableDescriptives"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(
+ 2.56340040017259, 40, 23.4545454545455, 24, 4, 8.54074594944217,
+ -0.224781704543678
+ )
+ )
+})
+
+test_that("Item Information table results match", {
+ table <- results[["results"]][["tableItemStatistics"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(
+ 0.887618350342237, "Q1", 0.666666666666667, 0.347591980764636,
+ 0.395894501980162, 0.666666666666667, 0.473803541479343, 0.886448561310041,
+ "Q2", 0.404040404040404, 0.422660887407708, 0.469512619319047,
+ 0.404040404040404, 0.49320261016887, 0.885858642159483, "Q3",
+ 0.636363636363636, 0.461002188606611, 0.504999388715257, 0.636363636363636,
+ 0.483493778415228, 0.88621667612025, "Q4", 0.818181818181818,
+ 0.461407639692688, 0.496759343248992, 0.818181818181818, 0.387657443028554,
+ 0.888138304366302, "Q5", 0.323232323232323, 0.312826594755356,
+ 0.362053438639018, 0.323232323232323, 0.470090803826778, 0.887029757465421,
+ "Q6", 0.545454545454545, 0.386283378421056, 0.435572353254021,
+ 0.545454545454545, 0.500463606960979, 0.887893167227372, "Q7",
+ 0.686868686868687, 0.328775065449762, 0.377015568747514, 0.686868686868687,
+ 0.466127438264859, 0.886643298531238, "Q8", 0.646464646464647,
+ 0.411074179885296, 0.457286040810093, 0.646464646464647, 0.480499980104298,
+ 0.886205125284887, "Q9", 0.525252525252525, 0.437172543807153,
+ 0.484095955176844, 0.525252525252525, 0.501903201160737, 0.885754161305689,
+ "Q10", 0.656565656565657, 0.468780775903847, 0.511810733171556,
+ 0.656565656565657, 0.477271500229107, 0.886851196049235, "Q11",
+ 0.494949494949495, 0.397358870658065, 0.446326922614578, 0.494949494949495,
+ 0.502518907629606, 0.885288861003517, "Q12", 0.515151515151515,
+ 0.493249690234436, 0.537108413493487, 0.515151515151515, 0.502313755995161,
+ 0.886823916021133, "Q13", 0.767676767676768, 0.404874510944395,
+ 0.446008097476569, 0.767676767676768, 0.424463234346504, 0.886280048100412,
+ "Q14", 0.727272727272727, 0.439354578601723, 0.481161261171939,
+ 0.727272727272727, 0.447628258171794, 0.888910075872708, "Q15",
+ 0.818181818181818, 0.244751529111002, 0.287184617501532, 0.818181818181818,
+ 0.387657443028554, 0.886712151630352, "Q16", 0.787878787878788,
+ 0.415795712835666, 0.455189535158361, 0.787878787878788, 0.410890701806659,
+ 0.889098334859378, "Q17", 0.505050505050505, 0.257587400087347,
+ 0.31210463741184, 0.505050505050505, 0.502518907629606, 0.88694435997992,
+ "Q18", 0.606060606060606, 0.391529037409299, 0.439667659967765,
+ 0.606060606060606, 0.491108322108806, 0.885947949531992, "Q19",
+ 0.515151515151515, 0.452926928816721, 0.499052422843385, 0.515151515151515,
+ 0.502313755995162, 0.88564483606331, "Q20", 0.424242424242424,
+ 0.472329064782446, 0.516893974782547, 0.424242424242424, 0.496742636335202,
+ 0.885171852193804, "Q21", 0.494949494949495, 0.50034733884224,
+ 0.543805587069383, 0.494949494949495, 0.502518907629606, 0.889018987939846,
+ "Q22", 0.555555555555556, 0.261719139249559, 0.315773007898445,
+ 0.555555555555556, 0.49943278484293, 0.887608697344554, "Q23",
+ 0.515151515151515, 0.350476575122602, 0.401533946802498, 0.515151515151515,
+ 0.502313755995161, 0.88986597878406, "Q24", 0.363636363636364,
+ 0.20210697519516, 0.25609399605667, 0.363636363636364, 0.483493778415228,
+ 0.884783730233453, "Q25", 0.737373737373737, 0.544343937310354,
+ 0.580272097888561, 0.737373737373737, 0.44230053929239, 0.88665871481649,
+ "Q26", 0.575757575757576, 0.409363796068735, 0.457201904090654,
+ 0.575757575757576, 0.496742636335202, 0.886258773963827, "Q27",
+ 0.545454545454545, 0.433974733572468, 0.480930909223175, 0.545454545454545,
+ 0.500463606960979, 0.888980942894191, "Q28", 0.484848484848485,
+ 0.264890699257377, 0.319151376133811, 0.484848484848485, 0.502313755995161,
+ 0.886219492535083, "Q29", 0.484848484848485, 0.436258934148329,
+ 0.483267835812377, 0.484848484848485, 0.502313755995161, 0.88774939527641,
+ "Q30", 0.252525252525253, 0.337124640890812, 0.382051071574535,
+ 0.252525252525253, 0.436671883156537, 0.888348359463818, "Q31",
+ 0.424242424242424, 0.303406110222096, 0.355747249141795, 0.424242424242424,
+ 0.496742636335202, 0.88428819831304, "Q32", 0.353535353535354,
+ 0.561557826416684, 0.599467414843483, 0.353535353535354, 0.480499980104298,
+ 0.887672362542716, "Q33", 0.545454545454545, 0.346330592196771,
+ 0.397375674543155, 0.545454545454545, 0.500463606960979, 0.889837876052086,
+ "Q34", 0.636363636363636, 0.203949058362162, 0.25789114690619,
+ 0.636363636363636, 0.483493778415228, 0.886904024074741, "Q35",
+ 0.535353535353535, 0.39408617745935, 0.44309059551095, 0.535353535353535,
+ 0.501286738449699, 0.886950122176769, "Q36", 0.555555555555556,
+ 0.391208337820021, 0.440168435252378, 0.555555555555556, 0.49943278484293,
+ 0.889412771343135, "Q37", 0.727272727272727, 0.220735771703533,
+ 0.270304409957408, 0.727272727272727, 0.447628258171794, 0.887925794772865,
+ "Q38", 0.696969696969697, 0.326210478288408, 0.374111516499348,
+ 0.696969696969697, 0.461906993344902, 0.886714468247132, "Q39",
+ 0.838383838383838, 0.427602068488912, 0.462672030494686, 0.838383838383838,
+ 0.369971612454052, 0.888225248551025, "Q40", 0.131313131313131,
+ 0.302300477575752, 0.33819731563888, 0.131313131313131, 0.339461297318015,
+ 0.888721270165779, "Q41", 0.171717171717172, 0.259130069580139,
+ 0.300293523935615, 0.171717171717172, 0.379053710060048, 0.889276469293747,
+ "Q42", 0.323232323232323, 0.236731247416707, 0.28834887774186,
+ 0.323232323232323, 0.470090803826778, 0.886708705565086, "Q43",
+ 0.434343434343434, 0.406216266765539, 0.454344781246639, 0.434343434343434,
+ 0.498192982885396
+ )
+ )
+})
+
+test_that("Test Summary table results match", {
+ table <- results[["results"]][["tableSummary"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(0.545454545454545, 0.375055902561138, 0.421344004412721, 43, 99)
+ )
+})
+
+# Consistency test 2, file: binary2.csv ########################################
+
+options <- analysisOptions("classicalTestTheory")
+options$items <- c("Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", "Q12", "Q13", "Q14", "Q15", "Q16", "Q17", "Q18", "Q19", "Q20")
+options$plotCorrelationHeatmap <- TRUE
+options$customMaxScore <- FALSE
+options$plotHistogram <- TRUE
+options$plotItems <- TRUE
+options$tableCronbachsAlpha <- TRUE
+options$tableDescriptives <- TRUE
+options$tableItemStatistics <- TRUE
+set.seed(1)
+results <- runAnalysis("classicalTestTheory", "binary2.csv", options)
+
+test_that("Item Correlation Heatmap plot matches", {
+ plotName <- results[["results"]][["plotCorrelationHeatmap"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "item-correlation-heatmap-2")
+})
+
+test_that("Histogram of Sum Scores plot matches", {
+ plotName <- results[["results"]][["plotHistogram"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "histogram-of-sum-scores-2")
+})
+
+test_that("Item Difficulty and Discrimination Plot matches", {
+ plotName <- results[["results"]][["plotItems"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "item-difficulty-and-discrimination-plot-2")
+})
+
+test_that("Test Reliability table results match", {
+ table <- results[["results"]][["tableCronbachsAlpha"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(0.709304580537563, 0.571062930538064, 0.792856262630907)
+ )
+})
+
+test_that("Descriptive Statistics of Sum Scores table results match", {
+ table <- results[["results"]][["tableDescriptives"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(2.30037595393627, 19, 11.1, 11.5, 3, 3.7211475078946, -0.177881049258767)
+ )
+})
+
+test_that("Item Information table results match", {
+ table <- results[["results"]][["tableItemStatistics"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(
+ 0.701824212271973, "Q1", 0.8, 0.238234538235264, 0.339328306123689,
+ 0.8, 0.404061017820884, 0.68194016312305, "Q2", 0.56, 0.444144293155973,
+ 0.549064591167952, 0.56, 0.501426536422407, 0.684953089240579,
+ "Q3", 0.44, 0.414323435846851, 0.522814491191795, 0.44, 0.501426536422407,
+ 0.7053133957442, "Q4", 0.46, 0.206733390524851, 0.33442801535778,
+ 0.46, 0.503457433905889, 0.674189074451859, "Q5", 0.56, 0.519803996722433,
+ 0.614689841108345, 0.56, 0.501426536422407, 0.705976634227755,
+ "Q6", 0.72, 0.191070240896555, 0.307134444609423, 0.72, 0.453557367611073,
+ 0.718588254472837, "Q7", 0.54, 0.0652261027947391, 0.199349598731185,
+ 0.54, 0.503457433905889, 0.704632072705951, "Q8", 0.26, 0.205458570693149,
+ 0.318105121499561, 0.26, 0.443087497693452, 0.705640502888209,
+ "Q9", 0.9, 0.184333754536444, 0.262413890068987, 0.9, 0.303045763365663,
+ 0.713635225046238, "Q10", 0.36, 0.112069901857977, 0.239792002994074,
+ 0.36, 0.484873221385061, 0.690083632019116, "Q11", 0.6, 0.363976142732779,
+ 0.476543891030621, 0.6, 0.494871659305394, 0.668414727411778,
+ "Q12", 0.46, 0.574052977043173, 0.661230636228575, 0.46, 0.503457433905889,
+ 0.695862166054817, "Q13", 0.36, 0.304938612280157, 0.420767099593375,
+ 0.36, 0.484873221385061, 0.706986648734221, "Q14", 0.62, 0.186459031378769,
+ 0.312073313402448, 0.62, 0.490314351478015, 0.684268499791858,
+ "Q15", 0.76, 0.445995231729357, 0.536463409948143, 0.76, 0.4314191105869,
+ 0.69102519141972, "Q16", 0.66, 0.356832993358516, 0.466469287331464,
+ 0.66, 0.478518120698406, 0.714986826118415, "Q17", 0.34, 0.0945332120441771,
+ 0.221200423722291, 0.34, 0.478518120698407, 0.697763347763348,
+ "Q18", 0.5, 0.284901441149095, 0.407193967348427, 0.5, 0.505076272276105,
+ 0.708457711442786, "Q19", 0.6, 0.171633252289402, 0.299225233902948,
+ 0.6, 0.494871659305394, 0.707363628403817, "Q20", 0.6, 0.183363777112674,
+ 0.310307649973428, 0.6, 0.494871659305394
+ )
+ )
+})
+
+test_that("Test Summary table results match", {
+ table <- results[["results"]][["tableSummary"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(0.555, 0.277404244819117, 0.389929760766726, 20, 50)
+ )
+})
+
+# Consistency test 3, file: scored.csv #########################################
+
+options <- analysisOptions("classicalTestTheory")
+options$items <- c("1a", "1b", "1c", "1d", "1e", "1f", "2a", "2b", "2c", "2d", "2e", "2f", "3a", "3b", "3c", "3d", "3e", "3f", "4a", "4b", "4c", "4d", "4e", "5a", "5b", "5c", "5d", "5e", "5f", "5g", "5h", "5i", "6a", "6b", "6c", "6d", "7a", "7b", "7c", "7d", "7e", "7f", "7g")
+options$plotCorrelationHeatmap <- TRUE
+options$customMaxScore <- FALSE
+options$plotHistogram <- TRUE
+options$plotItems <- TRUE
+options$tableCronbachsAlpha <- TRUE
+options$tableDescriptives <- TRUE
+options$tableItemStatistics <- TRUE
+set.seed(1)
+results <- runAnalysis("classicalTestTheory", "scored.csv", options)
+
+test_that("Item Correlation Heatmap plot matches", {
+ plotName <- results[["results"]][["plotCorrelationHeatmap"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "item-correlation-heatmap-3")
+})
+
+test_that("Histogram of Sum Scores plot matches", {
+ plotName <- results[["results"]][["plotHistogram"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "histogram-of-sum-scores-3")
+})
+
+test_that("Item Difficulty and Discrimination Plot matches", {
+ plotName <- results[["results"]][["plotItems"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "item-difficulty-and-discrimination-plot-3")
+})
+
+test_that("Test Reliability table results match", {
+ table <- results[["results"]][["tableCronbachsAlpha"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(0.829334057073083, 0.73516844798705, 0.877006995788597)
+ )
+})
+
+test_that("Descriptive Statistics of Sum Scores table results match", {
+ table <- results[["results"]][["tableDescriptives"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(
+ 5.02044971289884, 79.5, 54.7727272727273, 57, 10, 14.5665735481981,
+ -1.35514418077972
+ )
+ )
+})
+
+test_that("Item Information table results match", {
+ table <- results[["results"]][["tableItemStatistics"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(
+ 0.825407872456555, "1a", 0.545454545454545, 0.310587545323532,
+ 0.372009841855288, 1.09090909090909, 1.00092721392196, 0.829021219581504,
+ "1b", 0.98989898989899, 0.305819140562084, 0.312066870182252,
+ 0.98989898989899, 0.100503781525921, 0.821194757297456, "1c",
+ 0.750841750841751, 0.446583336940427, 0.507502156732886, 2.25252525252525,
+ 1.12796940853939, 0.825040003420433, "1d", 0.686868686868687,
+ 0.326579358121729, 0.383155098908431, 1.37373737373737, 0.932254876529718,
+ 0.828811258537718, "1e", 0.161616161616162, 0.154442646193458,
+ 0.179186860486002, 0.161616161616162, 0.369971612454052, 0.828475096374059,
+ "1f", 0.707070707070707, 0.175487801961505, 0.205839054450631,
+ 0.707070707070707, 0.457422353230807, 0.825252343839647, "2a",
+ 0.757575757575758, 0.32246037283752, 0.374944912316436, 1.51515151515152,
+ 0.861460984507896, 0.830941833948788, "2b", 0.323232323232323,
+ 0.0938374666871952, 0.157618962831734, 0.646464646464647, 0.940181607653557,
+ 0.823057666025013, "2c", 0.777777777777778, 0.655200449533896,
+ 0.671417985858415, 0.777777777777778, 0.417855447018673, 0.826064048771513,
+ "2d", 0.797979797979798, 0.448070782333193, 0.467135089539046,
+ 0.797979797979798, 0.34933750652523, 0.820475994408571, "2e",
+ 0.843434343434343, 0.64317519228432, 0.667667227724622, 1.68686868686869,
+ 0.61687931949921, 0.834109085596035, "2f", 0.818181818181818,
+ -0.0955040641744162, -0.0426297777541689, 1.63636363636364,
+ 0.775314886057107, 0.822625613576115, "3a", 0.797979797979798,
+ 0.445579506094514, 0.489438028576387, 1.5959595959596, 0.807101034557328,
+ 0.825286367813827, "3b", 0.638047138047138, 0.316893791627561,
+ 0.38858588353448, 1.91414141414141, 1.17595034091061, 0.831039942688473,
+ "3c", 0.878787878787879, -0.0933034938060058, -0.0709564044089731,
+ 0.878787878787879, 0.328034569878315, 0.834124735789869, "3d",
+ 0.474747474747475, 0.229033616923777, 0.357556647235747, 1.8989898989899,
+ 2.00761280464295, 0.82492722448934, "3e", 0.818181818181818,
+ 0.521813031844428, 0.541044982787497, 0.818181818181818, 0.387657443028553,
+ 0.819163342191373, "3f", 0.656565656565657, 0.494663382899795,
+ 0.590434337466842, 2.62626262626263, 1.90908600091643, 0.824939396633458,
+ "4a", 0.661616161616162, 0.343459851100549, 0.391039612190446,
+ 1.32323232323232, 0.793188898780504, 0.828230688546693, "4b",
+ 0.95959595959596, 0.206221943939458, 0.232166206600303, 1.91919191919192,
+ 0.395814006949349, 0.816380090081959, "4c", 0.601010101010101,
+ 0.551325356750977, 0.644784469294559, 3.60606060606061, 2.03448926458657,
+ 0.830425541760166, "4d", 0.404040404040404, 0.122612046252644,
+ 0.189033834316667, 0.808080808080808, 0.98640522033774, 0.832092861310518,
+ "4e", 0.124579124579125, 0.0342669502694558, 0.0950516700215364,
+ 0.373737373737374, 0.887393093139797, 0.829657095484388, "5a",
+ 0.464646464646465, 0.0846006575554281, 0.118718096165657, 0.464646464646465,
+ 0.501286738449699, 0.822764737510034, "5b", 0.51010101010101,
+ 0.423640553655342, 0.472597525604939, 1.02020202020202, 0.880396454987786,
+ 0.824849936262149, "5c", 0.898989898989899, 0.648895144368651,
+ 0.660851448125922, 0.898989898989899, 0.302875656272066, 0.823049760450035,
+ "5d", 0.53030303030303, 0.416535224849759, 0.464452589318387,
+ 1.06060606060606, 0.854975615097807, 0.827356131256216, "5e",
+ 0.545454545454545, 0.255350364224133, 0.287326226409865, 0.545454545454545,
+ 0.500463606960979, 0.8267514074199, "5f", 0.292929292929293,
+ 0.259033386666708, 0.317146679769048, 0.585858585858586, 0.914844706461614,
+ 0.828606582615656, "5g", 0.181818181818182, 0.171918029986198,
+ 0.223334037983787, 0.363636363636364, 0.775314886057107, 0.824315638264913,
+ "5h", 0.390572390572391, 0.355411378506915, 0.439200948635655,
+ 1.17171717171717, 1.42170064905325, 0.828699958706545, "5i",
+ 0.656565656565657, 0.156390260451006, 0.188271830545924, 0.656565656565657,
+ 0.477271500229107, 0.830964440503085, "6a", 0.282828282828283,
+ -0.02972602632599, 0.00133650283268321, 0.282828282828283, 0.452665665702851,
+ 0.825495216073241, "6b", 0.717171717171717, 0.309782447656383,
+ 0.365428011357325, 1.43434343434343, 0.905331331405701, 0.822309737786764,
+ "6c", 0.838383838383838, 0.42132281154728, 0.516562267715603,
+ 4.19191919191919, 1.73014549156273, 0.819157372166777, "6d",
+ 0.666666666666667, 0.548977709364202, 0.593613494854295, 1.33333333333333,
+ 0.947607082958685, 0.827442658618, "7a", 0.888888888888889,
+ 0.324414711713778, 0.343748785936796, 0.888888888888889, 0.315869027652895,
+ 0.819138192812406, "7b", 0.919191919191919, 0.593638181804164,
+ 0.629560452229106, 2.75757575757576, 0.821781403613318, 0.828257657680071,
+ "7c", 0.909090909090909, 0.241882358087676, 0.260513021161164,
+ 0.909090909090909, 0.288942798198532, 0.826268295606949, "7d",
+ 0.429292929292929, 0.278909244686928, 0.340981983653898, 0.858585858585859,
+ 0.989847452791579, 0.825614562502229, "7e", 0.232323232323232,
+ 0.307870186868763, 0.360151696167467, 0.464646464646465, 0.848926468693007,
+ 0.823177044437233, "7f", 0.494949494949495, 0.383683449403653,
+ 0.464263866994404, 1.48484848484848, 1.40235688173435, 0.821014957520047,
+ "7g", 0.666666666666667, 0.438900025328202, 0.515992801255663,
+ 2, 1.42141062443803
+ )
+ )
+})
+
+test_that("Test Summary table results match", {
+ table <- results[["results"]][["tableSummary"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(0.620742306788818, 0.315133397974437, 0.364375484127085, 43, 99)
+ )
+})
+
+# Consistency test 4, file: scored2.csv ########################################
+
+options <- analysisOptions("classicalTestTheory")
+options$items <- c("1a", "1b", "1c", "1d", "1e", "1f", "1g", "1h", "1i", "2a", "2b", "2c", "2d", "2e", "2f", "3a", "3b", "3c", "3d", "3e", "3f", "3g", "4a", "4b", "4c", "4d", "4e", "4f", "5a", "5b", "5c", "5d", "5e", "5f", "5g", "6a", "6b", "6c", "6d", "6e", "6f", "7a", "7b", "7c", "7d", "7e", "7f")
+options$plotCorrelationHeatmap <- TRUE
+options$customMaxScore <- FALSE
+options$plotHistogram <- TRUE
+options$plotItems <- TRUE
+options$tableCronbachsAlpha <- TRUE
+options$tableDescriptives <- TRUE
+options$tableItemStatistics <- TRUE
+set.seed(1)
+results <- runAnalysis("classicalTestTheory", "scored2.csv", options)
+
+test_that("Item Correlation Heatmap plot matches", {
+ plotName <- results[["results"]][["plotCorrelationHeatmap"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "item-correlation-heatmap-4")
+})
+
+test_that("Histogram of Sum Scores plot matches", {
+ plotName <- results[["results"]][["plotHistogram"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "histogram-of-sum-scores-4")
+})
+
+test_that("Item Difficulty and Discrimination Plot matches", {
+ plotName <- results[["results"]][["plotItems"]][["data"]]
+ testPlot <- results[["state"]][["figures"]][[plotName]][["obj"]]
+ jaspTools::expect_equal_plots(testPlot, "item-difficulty-and-discrimination-plot-4")
+})
+
+test_that("Test Reliability table results match", {
+ table <- results[["results"]][["tableCronbachsAlpha"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(0.842179292006487, 0.757417413034678, 0.889849674902588)
+ )
+})
+
+test_that("Descriptive Statistics of Sum Scores table results match", {
+ table <- results[["results"]][["tableDescriptives"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(
+ 3.77295225094427, 87, 58.022602739726, 59.67, 13.17, 14.1654501465319,
+ -0.662397617792948
+ )
+ )
+})
+
+test_that("Item Information table results match", {
+ table <- results[["results"]][["tableItemStatistics"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(
+ 0.841049339431467, "1a", 0.671232876712329, 0.205322821872927,
+ 0.237197658222613, 0.671232876712329, 0.47301616487964, 0.841888571938734,
+ "1b", 0.780821917808219, 0.134183924299201, 0.163003702607099,
+ 0.780821917808219, 0.416552495773534, 0.841937736299186, "1c",
+ 0.958904109589041, 0.159060465892691, 0.172798822146357, 0.958904109589041,
+ 0.199885812151697, 0.84255819202078, "1d", 0.958904109589041,
+ 0.0369152462511328, 0.0510031450721802, 0.958904109589041, 0.199885812151697,
+ 0.843410760973421, "1e", 0.958904109589041, -0.131614370036826,
+ -0.117735126830827, 0.958904109589041, 0.199885812151697, 0.841532184772616,
+ "1f", 0.89041095890411, 0.182759013927911, 0.204178439229569,
+ 0.89041095890411, 0.314538631950585, 0.842252153933355, "1g",
+ 0.986301369863014, 0.128868021722698, 0.136988919448999, 0.986301369863014,
+ 0.117041147196131, 0.842382631797695, "1h", 0.891232876712329,
+ 0.072832186577499, 0.0851351258165446, 0.891232876712329, 0.175285047260166,
+ 0.83829236114358, "1i", 0.842465753424658, 0.385999377329272,
+ 0.420235542286275, 1.68493150684932, 0.574376771639563, 0.843526788139729,
+ "2a", 0.770547945205479, -0.0534259352479937, -0.0294001229880557,
+ 1.54109589041096, 0.341091229421737, 0.839527790500566, "2b",
+ 0.780821917808219, 0.298287324704043, 0.336669985666584, 1.56164383561644,
+ 0.600608519426178, 0.840177484307567, "2c", 0.876712328767123,
+ 0.338757569272932, 0.359363542669226, 0.876712328767123, 0.331042355440947,
+ 0.839976363520101, "2d", 0.89041095890411, 0.375773728338998,
+ 0.394763372502014, 0.89041095890411, 0.314538631950585, 0.835969031373748,
+ "2e", 0.707762557077626, 0.41541922674205, 0.483691760900148,
+ 2.12328767123288, 1.18959850229035, 0.840499903936586, "2f",
+ 0.534246575342466, 0.245497189348116, 0.278673065522264, 0.534246575342466,
+ 0.502277916120977, 0.840025361363471, "3a", 0.726027397260274,
+ 0.261450490013402, 0.320031461316576, 1.45205479452055, 0.898163185655575,
+ 0.838067544041151, "3b", 0.301369863013699, 0.456632545809128,
+ 0.482255846178886, 0.301369863013699, 0.462028483575096, 0.836747148664076,
+ "3c", 0.858447488584475, 0.402034612455665, 0.454403355812812,
+ 2.57534246575342, 0.896254679503948, 0.84248366713909, "3d",
+ 0.47945205479452, 0.0909256210243481, 0.126086553938774, 0.47945205479452,
+ 0.50303492923498, 0.838883157464488, "3e", 0.616438356164384,
+ 0.416457634522909, 0.527432717272594, 2.46575342465753, 1.95847298637386,
+ 0.837694018204713, "3f", 0.89041095890411, 0.40643469411003,
+ 0.44317331711636, 1.78082191780822, 0.629077263901169, 0.836028354733845,
+ "3g", 0.205479452054795, 0.447205141616188, 0.492568751410669,
+ 0.410958904109589, 0.813695555242257, 0.833359692094889, "4a",
+ 0.561643835616438, 0.492542962264193, 0.559950660195059, 1.68493150684932,
+ 1.28966740252377, 0.841620969112698, "4b", 0.273972602739726,
+ 0.192218031863699, 0.252908085727045, 0.547945205479452, 0.898163185655575,
+ 0.841713308804523, "4c", 0.671232876712329, 0.150376105227277,
+ 0.182931286774769, 0.671232876712329, 0.47301616487964, 0.835170430054435,
+ "4d", 0.821917808219178, 0.499580712310678, 0.539841195579924,
+ 1.64383561643836, 0.770459152672011, 0.836403329004406, "4e",
+ 0.712328767123288, 0.404718085461256, 0.481134255777537, 2.84931506849315,
+ 1.31941941016065, 0.833901549597996, "4f", 0.726027397260274,
+ 0.475988056628875, 0.547879838458075, 2.17808219178082, 1.34724477848336,
+ 0.835060542195669, "5a", 0.73972602739726, 0.512704445294726,
+ 0.551070686641768, 1.47945205479452, 0.747395273992281, 0.83856127486779,
+ "5b", 0.726027397260274, 0.324449338814008, 0.380595987781746,
+ 1.45205479452055, 0.898163185655575, 0.842947599558227, "5c",
+ 0.990890410958904, -0.068052896498981, -0.0571106568785357,
+ 1.98178082191781, 0.155664725770854, 0.841563748715858, "5d",
+ 0.13013698630137, 0.163185840074065, 0.199340802937539, 0.26027397260274,
+ 0.527767764064259, 0.839029835839442, "5e", 0.684931506849315,
+ 0.399841971590727, 0.50786832348553, 2.73972602739726, 1.87103207749296,
+ 0.840300932818648, "5f", 0.945205479452055, 0.427141408496782,
+ 0.440321177215116, 0.945205479452055, 0.229153694111865, 0.836979937977451,
+ "5g", 0.349315068493151, 0.400472521940696, 0.44897912417149,
+ 0.698630136986301, 0.828065542005538, 0.838715132863733, "6a",
+ 0.547945205479452, 0.38372841849814, 0.413691964236509, 0.547945205479452,
+ 0.501140252336026, 0.843337833882042, "6b", 0.561643835616438,
+ 0.0229162465135563, 0.0581537494999103, 0.561643835616438, 0.499619337592326,
+ 0.837385367511268, "6c", 0.324794520547945, 0.417800001821942,
+ 0.455429185670147, 0.649589041095891, 0.652027688480252, 0.838901416975193,
+ "6d", 0.515981735159817, 0.315714776818874, 0.385145650183527,
+ 1.54794520547945, 1.10605776283775, 0.835154277432019, "6e",
+ 0.63013698630137, 0.457510387848651, 0.510924594079674, 1.26027397260274,
+ 0.972216786242684, 0.840707762071622, "6f", 0.10958904109589,
+ 0.285242079633279, 0.305575472089421, 0.10958904109589, 0.314538631950585,
+ 0.842577485525166, "7a", 1, "", "", 1, 0, 0.841248111992031,
+ "7b", 0.780821917808219, 0.201875056519376, 0.257955518895805,
+ 1.56164383561644, 0.833104991547068, 0.832954807670114, "7c",
+ 0.657534246575342, 0.54626798212688, 0.592726263723645, 1.31506849315068,
+ 0.955636965134993, 0.837718250173357, "7d", 0.541095890410959,
+ 0.402202889227032, 0.499427408023013, 2.16438356164384, 1.68336384980703,
+ 0.83781710935883, "7e", 0.424657534246575, 0.442103210484609,
+ 0.551648965245866, 1.6986301369863, 1.99084663388085, 0.835299463072246,
+ "7f", 0.349315068493151, 0.491539604618094, 0.532531516114483,
+ 0.698630136986301, 0.776118037751727
+ )
+ )
+})
+
+test_that("Test Summary table results match", {
+ table <- results[["results"]][["tableSummary"]][["data"]]
+ jaspTools::expect_equal_tables(
+ table,
+ list(0.667110171961527, 0.296040081915756, 0.339596541107537, 47, 73)
+ )
+})
+
+################################################################################