From bbad9e38cdbfda0b8a0f824945553f229629b95e Mon Sep 17 00:00:00 2001 From: Lukas Jung Date: Sun, 10 Mar 2024 17:05:28 +0100 Subject: [PATCH 1/5] Fix #6 * The null check is covered by `identical()`. --- R/core-functions.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/core-functions.R b/R/core-functions.R index 345f45c..f002500 100644 --- a/R/core-functions.R +++ b/R/core-functions.R @@ -103,7 +103,7 @@ set_parameters <- function(mean, sd, n_obs, min_val, max_val, stop("The mean is outside the possible range, which is impossible - please check inputs.") } - if (!is.null(restrictions_minimum) && restrictions_minimum == "range") { + if (identical(restrictions_minimum, "range")) { restrictions_minimum <- list(1, 1) names(restrictions_minimum) <- c(min_val, max_val) } From c6ca2d2c383357768fdc9b63979dc3ce975215c6 Mon Sep 17 00:00:00 2001 From: Lukas Jung Date: Sun, 10 Mar 2024 17:12:25 +0100 Subject: [PATCH 2/5] Add test for set_parameters() --- tests/testthat/test-core-and-plot-functions.R | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/testthat/test-core-and-plot-functions.R b/tests/testthat/test-core-and-plot-functions.R index 76fe20f..2e77b4c 100644 --- a/tests/testthat/test-core-and-plot-functions.R +++ b/tests/testthat/test-core-and-plot-functions.R @@ -26,6 +26,15 @@ test_that("Adjusting mean works", { expect_equal(sum(vec == 7), 0) }) +test_that("Example set_parameters() run works", { + expect_no_error( + set_parameters(mean = 1.95, sd = 1.55, n_obs = 20, + min_val = 1, max_val = 5, n_items = 3, + restrictions_exact = list("3"=0, "3.67" = 2), + restrictions_minimum = list("1" = 1, "5" = 1)) + ) +}) + restrictions <- list("2.33" = 1, "4" = 3, "4.67" = 0) parameters <- set_parameters(3.29, 1.29, 15, 1, 5, m_prec = 2, n_items = 3, From 148cba554f17b78f4d730a8fc82557230e556c1b Mon Sep 17 00:00:00 2001 From: Lukas Jung Date: Sun, 10 Mar 2024 17:23:32 +0100 Subject: [PATCH 3/5] Switch from `README.md` to `README.Rmd` * The changes in the three other files followed automatically from creating and rendering `README.Rmd`. --- .Rbuildignore | 1 + README.Rmd | 101 ++++++++++++++++ README.md | 148 ++++++++++++++++++++--- man/figures/README-unnamed-chunk-7-1.png | Bin 0 -> 33562 bytes 4 files changed, 234 insertions(+), 16 deletions(-) create mode 100644 README.Rmd create mode 100644 man/figures/README-unnamed-chunk-7-1.png diff --git a/.Rbuildignore b/.Rbuildignore index eb41eaf..5a868c9 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -8,3 +8,4 @@ ^pkgdown$ ^CRAN-RELEASE$ ^CRAN-SUBMISSION$ +^README\.Rmd$ diff --git a/README.Rmd b/README.Rmd new file mode 100644 index 0000000..5ff7d3c --- /dev/null +++ b/README.Rmd @@ -0,0 +1,101 @@ +--- +output: github_document +--- + + + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + fig.path = "man/figures/README-", + out.width = "100%" +) +``` + +# rsprite2 - Identify Distributions that Match Reported Sample Parameters + + + [![R-CMD-check](https://github.com/LukasWallrich/rsprite2/workflows/R-CMD-check/badge.svg)](https://github.com/LukasWallrich/rsprite2/actions) + [![Codecov test coverage](https://codecov.io/gh/LukasWallrich/rsprite2/branch/master/graph/badge.svg)](https://app.codecov.io/gh/LukasWallrich/rsprite2?branch=master) + [![R badge](https://img.shields.io/badge/Build%20with-♥%20and%20R-blue)](https://github.com/LukasWallrich/rsprite2) +[![R-CMD-check](https://github.com/LukasWallrich/rsprite2/workflows/R-CMD-check/badge.svg)](https://github.com/LukasWallrich/rsprite2/actions) + + +This package creates possible distributions based on reported sample parameters, using the SPRITE algorithm. This can be used to check what the original sample might have looked like, and thus to understand the data generation process better. This can help with the identification of fabricated data or misreported parameters, but also with checking whether sample characteristics such as floor/ceiling effects might suggest that findings are spurious. + +For that, it implements the SPRITE algorithm proposed by [Heathers et al. (2018)](https://peerj.com/preprints/26968/). Much of the code for is based on [Nick Brown's rSPRITE shiny app](https://github.com/sTeamTraen/rSPRITE), with some extensions. If you are just interested in interactive use and do not need these extensions (see advanced usage below) that Shiny online app (see https://shiny.ieis.tue.nl/sprite/) might be better for you. + +The package also includes dedicated functions to run the GRIM and GRIMMER tests. `GRIM_test()` checks whether a reported mean based on integers is consistent with a given sample size, while `GRIMMER_test()` checks whether a reported standard deviation is consistent with a reported mean and sample size. They can help catch impossible distributions and reporting errors without running any simulations. + +## Installation + +rsprite2 can be installed from CRAN with: + +```{r warning=FALSE, message=FALSE, eval=FALSE} +install.packages("rsprite2") +``` + +Or you might want to install the development version from GitHub: + +```{r, warning=FALSE, message=FALSE, eval=FALSE} +install.packages("remotes") +remotes::install_github('LukasWallrich/rsprite2') +``` + +## Simple example + +To create possible distributions, SPRITE needs the reported mean, standard deviation, sample size and range of values. + +For instance, what distribution of 20 responses on a 1 to 5 scale might result in a mean of 2.2 and a standard deviation of 1.3? + +```{r} +library(rsprite2) +sprite_parameters <- set_parameters(mean = 2.2, sd = 1.3, n_obs = 20, min_val = 1, max_val = 5) +find_possible_distribution(sprite_parameters) +``` + +If these means and standard deviations had been reported to two decimal places, they might be 2.20 and 1.33. NB: Given that trailing zeroes are ignored by R, you need to *specify the precision if mean or standard deviation ends in 0*. + +```{r} +sprite_parameters <- set_parameters(mean = 2.20, m_prec = 2, sd = 1.32, + n_obs = 20, min_val = 1, max_val = 5) +find_possible_distribution(sprite_parameters) +``` + +To find more than one distribution that matches the parameters, you can use `find_possible_distributions()` + +```{r} +find_possible_distributions(sprite_parameters, 10) +``` + +They can then be plotted to identify features that are shared across distributions. + +```{r} +res <- find_possible_distributions(sprite_parameters, 10) +plot_distributions(res) +``` + +## Advanced features + +### Multi-item scales + +Often, several Likert-type items are averaged to measure a single construct (e.g., participants might be asked how happy, satisfied and fulfilled they are, with the results averaged into a measure of well-being). Possible resulting distribution can be explored by rsprite2 by specifying the `n_items` parameter. + +```{r} +sprite_parameters <- set_parameters(mean = 1.95, sd = 1.55, n_obs = 20, + min_val = 1, max_val = 5, n_items = 3) +find_possible_distribution(sprite_parameters) +``` + +### Restrictions + +Sometimes, you might know how often certain values should appear in the distribution. Such restrictions need to be passed to the `set_parameters()` function as a named list. They can either specify the exact number of occurrences (`restrictions_exact`) or the minimum number of occurrences (`restrictions_minimum`) of a specific value. + +```{r} +sprite_parameters <- set_parameters(mean = 1.95, sd = 1.55, n_obs = 20, + min_val = 1, max_val = 5, n_items = 3, + restrictions_exact = list("3"=0, "3.67" = 2), + restrictions_minimum = list("1" = 1, "5" = 1)) +find_possible_distribution(sprite_parameters) +``` diff --git a/README.md b/README.md index 366baa5..b91d2f5 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,40 @@ + + + # rsprite2 - Identify Distributions that Match Reported Sample Parameters - [![R-CMD-check](https://github.com/LukasWallrich/rsprite2/workflows/R-CMD-check/badge.svg)](https://github.com/LukasWallrich/rsprite2/actions) - [![Codecov test coverage](https://codecov.io/gh/LukasWallrich/rsprite2/branch/master/graph/badge.svg)](https://app.codecov.io/gh/LukasWallrich/rsprite2?branch=master) - [![R badge](https://img.shields.io/badge/Build%20with-♥%20and%20R-blue)](https://github.com/LukasWallrich/rsprite2) + +[![R-CMD-check](https://github.com/LukasWallrich/rsprite2/workflows/R-CMD-check/badge.svg)](https://github.com/LukasWallrich/rsprite2/actions) +[![Codecov test +coverage](https://codecov.io/gh/LukasWallrich/rsprite2/branch/master/graph/badge.svg)](https://app.codecov.io/gh/LukasWallrich/rsprite2?branch=master) +[![R +badge](https://img.shields.io/badge/Build%20with-♥%20and%20R-blue)](https://github.com/LukasWallrich/rsprite2) [![R-CMD-check](https://github.com/LukasWallrich/rsprite2/workflows/R-CMD-check/badge.svg)](https://github.com/LukasWallrich/rsprite2/actions) -This package creates possible distributions based on reported sample parameters, using the SPRITE algorithm. This can be used to check what the original sample might have looked like, and thus to understand the data generation process better. This can help with the identification of fabricated data or misreported parameters, but also with checking whether sample characteristics such as floor/ceiling effects might suggest that findings are spurious. - -For that, it implements the SPRITE algorithm proposed by [Heathers et al. (2018)](https://peerj.com/preprints/26968/). Much of the code for is based on [Nick Brown's rSPRITE shiny app](https://github.com/sTeamTraen/rSPRITE), with some extensions. If you are just interested in interactive use and do not need these extensions (see advanced usage below) that Shiny online app (see https://shiny.ieis.tue.nl/sprite/) might be better for you. - -The package also includes dedicated functions to run the GRIM and GRIMMER tests. `GRIM_test()` checks whether a reported mean based on integers is consistent with a given sample size, while `GRIMMER_test()` checks whether a reported standard deviation is consistent with a reported mean and sample size. They can help catch impossible distributions and reporting errors without running any simulations. +This package creates possible distributions based on reported sample +parameters, using the SPRITE algorithm. This can be used to check what +the original sample might have looked like, and thus to understand the +data generation process better. This can help with the identification of +fabricated data or misreported parameters, but also with checking +whether sample characteristics such as floor/ceiling effects might +suggest that findings are spurious. + +For that, it implements the SPRITE algorithm proposed by [Heathers et +al. (2018)](https://peerj.com/preprints/26968/). Much of the code for is +based on [Nick Brown’s rSPRITE shiny +app](https://github.com/sTeamTraen/rSPRITE), with some extensions. If +you are just interested in interactive use and do not need these +extensions (see advanced usage below) that Shiny online app (see +) might be better for you. + +The package also includes dedicated functions to run the GRIM and +GRIMMER tests. `GRIM_test()` checks whether a reported mean based on +integers is consistent with a given sample size, while `GRIMMER_test()` +checks whether a reported standard deviation is consistent with a +reported mean and sample size. They can help catch impossible +distributions and reporting errors without running any simulations. ## Installation @@ -30,52 +53,129 @@ remotes::install_github('LukasWallrich/rsprite2') ## Simple example -To create possible distributions, SPRITE needs the reported mean, standard deviation, sample size and range of values. +To create possible distributions, SPRITE needs the reported mean, +standard deviation, sample size and range of values. -For instance, what distribution of 20 responses on a 1 to 5 scale might result in a mean of 2.2 and a standard deviation of 1.3? +For instance, what distribution of 20 responses on a 1 to 5 scale might +result in a mean of 2.2 and a standard deviation of 1.3? ``` r library(rsprite2) sprite_parameters <- set_parameters(mean = 2.2, sd = 1.3, n_obs = 20, min_val = 1, max_val = 5) find_possible_distribution(sprite_parameters) +#> $outcome +#> [1] "success" +#> +#> $values +#> [1] 2 2 2 4 2 1 1 4 1 1 2 1 4 2 5 1 4 2 3 1 +#> +#> $mean +#> [1] 2.25 +#> +#> $sd +#> [1] 1.292692 +#> +#> $iterations +#> [1] 4 ``` -If these means and standard deviations had been reported to two decimal places, they might be 2.20 and 1.33. NB: Given that trailing zeroes are ignored by R, you need to *specify the precision if mean or standard deviation ends in 0*. +If these means and standard deviations had been reported to two decimal +places, they might be 2.20 and 1.33. NB: Given that trailing zeroes are +ignored by R, you need to *specify the precision if mean or standard +deviation ends in 0*. ``` r sprite_parameters <- set_parameters(mean = 2.20, m_prec = 2, sd = 1.32, n_obs = 20, min_val = 1, max_val = 5) find_possible_distribution(sprite_parameters) +#> $outcome +#> [1] "success" +#> +#> $values +#> [1] 4 4 1 1 1 1 1 4 1 2 2 4 4 2 1 2 1 1 4 3 +#> +#> $mean +#> [1] 2.2 +#> +#> $sd +#> [1] 1.321881 +#> +#> $iterations +#> [1] 4 ``` -To find more than one distribution that matches the parameters, you can use `find_possible_distributions()` +To find more than one distribution that matches the parameters, you can +use `find_possible_distributions()` ``` r find_possible_distributions(sprite_parameters, 10) +#> Only 9 matching distributions could be found. You can try again - given that SPRITE is based on random number generation, more distributions might be found then. +#> # A tibble: 9 × 6 +#> id outcome distribution mean sd iterations +#> +#> 1 1 success 2.2 1.32 8 +#> 2 2 success 2.2 1.32 2 +#> 3 3 success 2.2 1.32 3 +#> 4 4 success 2.2 1.32 4 +#> 5 5 success 2.2 1.32 4 +#> 6 6 success 2.2 1.32 3 +#> 7 7 success 2.2 1.32 1 +#> 8 8 success 2.2 1.32 1 +#> 9 9 success 2.2 1.32 4 ``` -They can then be plotted to identify features that are shared across distributions. +They can then be plotted to identify features that are shared across +distributions. ``` r res <- find_possible_distributions(sprite_parameters, 10) +#> Only 9 matching distributions could be found. You can try again - given that SPRITE is based on random number generation, more distributions might be found then. plot_distributions(res) -``` +#> Warning: Removed 18 rows containing missing values or values outside the scale range +#> (`geom_bar()`). +``` + + ## Advanced features ### Multi-item scales -Often, several Likert-type items are averaged to measure a single construct (e.g., participants might be asked how happy, satisfied and fulfilled they are, with the results averaged into a measure of well-being). Possible resulting distribution can be explored by rsprite2 by specifying the `n_items` parameter. +Often, several Likert-type items are averaged to measure a single +construct (e.g., participants might be asked how happy, satisfied and +fulfilled they are, with the results averaged into a measure of +well-being). Possible resulting distribution can be explored by rsprite2 +by specifying the `n_items` parameter. ``` r sprite_parameters <- set_parameters(mean = 1.95, sd = 1.55, n_obs = 20, min_val = 1, max_val = 5, n_items = 3) find_possible_distribution(sprite_parameters) +#> $outcome +#> [1] "success" +#> +#> $values +#> [1] 4.333333 1.000000 1.000000 1.000000 5.000000 1.000000 5.000000 4.333333 +#> [9] 1.000000 1.000000 1.000000 1.000000 3.000000 1.000000 3.333333 1.000000 +#> [17] 1.000000 1.000000 1.000000 1.000000 +#> +#> $mean +#> [1] 1.95 +#> +#> $sd +#> [1] 1.549476 +#> +#> $iterations +#> [1] 49 ``` ### Restrictions -Sometimes, you might know how often certain values should appear in the distribution. Such restrictions need to be passed to the `set_parameters()` function as a named list. They can either specify the exact number of occurrences (`restrictions_exact`) or the minimum number of occurrences (`restrictions_minimum`) of a specific value. +Sometimes, you might know how often certain values should appear in the +distribution. Such restrictions need to be passed to the +`set_parameters()` function as a named list. They can either specify the +exact number of occurrences (`restrictions_exact`) or the minimum number +of occurrences (`restrictions_minimum`) of a specific value. ``` r sprite_parameters <- set_parameters(mean = 1.95, sd = 1.55, n_obs = 20, @@ -83,4 +183,20 @@ sprite_parameters <- set_parameters(mean = 1.95, sd = 1.55, n_obs = 20, restrictions_exact = list("3"=0, "3.67" = 2), restrictions_minimum = list("1" = 1, "5" = 1)) find_possible_distribution(sprite_parameters) +#> $outcome +#> [1] "failure" +#> +#> $values +#> [1] 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 4.000000 +#> [9] 1.000000 1.000000 1.000000 4.333333 1.000000 1.000000 1.000000 4.333333 +#> [17] 1.000000 5.000000 3.666667 3.666667 +#> +#> $mean +#> [1] 1.95 +#> +#> $sd +#> [1] 1.511264 +#> +#> $iterations +#> [1] 20000 ``` diff --git a/man/figures/README-unnamed-chunk-7-1.png b/man/figures/README-unnamed-chunk-7-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f9158aed2dbd8855a8bc255d94d1ca5c129a175e GIT binary patch literal 33562 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 literal 0 HcmV?d00001 From a0913d3607046b06d369e37e8a3cf3f738b02bdc Mon Sep 17 00:00:00 2001 From: Lukas Jung Date: Sun, 10 Mar 2024 18:57:44 +0100 Subject: [PATCH 4/5] re-enable named `restrictions_minimum` arguments * Discussed in https://github.com/LukasWallrich/rsprite2/pull/8 * Wrapping in `isTRUE()` because `checkmate::check_choice()` returns a string instead of `FALSE` if the check fails. --- R/core-functions.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/core-functions.R b/R/core-functions.R index f002500..49b933b 100644 --- a/R/core-functions.R +++ b/R/core-functions.R @@ -103,7 +103,7 @@ set_parameters <- function(mean, sd, n_obs, min_val, max_val, stop("The mean is outside the possible range, which is impossible - please check inputs.") } - if (identical(restrictions_minimum, "range")) { + if (isTRUE(checkmate::check_choice(restrictions_minimum, "range"))) { restrictions_minimum <- list(1, 1) names(restrictions_minimum) <- c(min_val, max_val) } From 41b67cb9ce1a943641718b4f05ae6dee5eac5c0a Mon Sep 17 00:00:00 2001 From: Lukas Jung Date: Sun, 10 Mar 2024 19:25:30 +0100 Subject: [PATCH 5/5] enter Lukas Jung in DESCRIPTION file --- DESCRIPTION | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6601658..370cf7c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -10,7 +10,11 @@ Authors@R: person(given = "Aurélien", family = "Allard", role = c("ctb"), - email = "aurelien.ab.allard@gmail.com")) + email = "aurelien.ab.allard@gmail.com"), + person(given = "Lukas", + family = "Jung", + role = c("ctb"), + email = "jung-lukas@gmx.net")) Description: The SPRITE algorithm creates possible distributions of discrete responses based on reported sample parameters, such as mean, standard deviation and range (Heathers et al., 2018, ). This package implements it,