From 6b94206d3acceb886148b45f18cbc703d9b81c36 Mon Sep 17 00:00:00 2001 From: venpopov Date: Tue, 13 Feb 2024 18:08:57 +0100 Subject: [PATCH] Add contents to readme, move info about package structure after how to fit --- README.Rmd | 98 +++++++++++++---------- README.md | 94 +++++++++++++--------- man/figures/README-unnamed-chunk-4-1.png | Bin 6134 -> 6184 bytes 3 files changed, 108 insertions(+), 84 deletions(-) diff --git a/README.Rmd b/README.Rmd index ae809adf..48aec8e3 100644 --- a/README.Rmd +++ b/README.Rmd @@ -27,6 +27,17 @@ representation of the cognitive processes underlying observed behavior, because they decompose observed behavior into several theoretically meaningful parameters that each represent distinct cognitive processes. +## Getting started + +See the following sections for more information on the `bmm` package: + +- [Available models](#available-models) +- [Installation](#installation) +- [Fitting models using the bmm](#fitting-models-using-the-bmm) +- [Exploring cogntive measurement models](#exploring-cogntive-measurement-models) +- [The general structure of the bmm package](#the-general-structure-of-the-bmm-package) +- [Contributing to the `bmm` package](#contributing-to-the-bmm-package) + ## Available models @@ -113,30 +124,9 @@ if (!requireNamespace("remotes")) { remotes::install_github("venpopov/bmm@v0.0.1") ``` -## The general structure of the bmm package - -The main building block of the bmm package is that cognitive measurement models -can often be specified as distributional models for which the distributional -parameters of the generalized linear mixed model are a function of cognitive -measurement model parameters. These functions that translate the cognitive -measurement model parameters into distributional parameters is what we -implement in the bmm package. - - -```{r bmm-logic, echo=F, fig.cap="", out.width=600, fig.align = 'center'} -knitr::include_graphics("man/figures/README-bmmLogic.jpg") -``` - -As these function can become complicated and their implementation changes with -differences in experimental designs, the bmm package provides general -translation functions that eases the use of the cognitive measurement models for -end users. This way researchers that face challenges in writing their own STAN -code to implement such models themselves can still use these models in almost -any experimental design. - ## Fitting models using the bmm -The core function of the bmm package is the `fit_model` function. This function +The core function of the bmm package is the `fit_model()` function. This function takes: 1. a linear model formula specifying how parameters of the model should vary as @@ -155,24 +145,6 @@ Measurement Model would look like this: ?IMMfull ``` -The function will then call the appropriate functions for the specified model -and will perform several steps: - -1. Configure the Sample (e.g., set up prallelization) -2. Check the information passed to the `fit_model` function: - - if the model is installed and all required arguments were provided - - if a valid formula was passed - - if the data contains all necessary variables -3. Configure the called model (including specifying priors were necessary) -4. Calling `brms` and passing the specified arguments -5. Posprocessing the output and passing it to the user - -This process is illustrated in the Figure below: - -```{r fitModel, echo=F, fig.cap="", out.width=600, fig.align = 'center'} -knitr::include_graphics("man/figures/README-fitModel_process.jpg") -``` - A complete call to fit a model using bmm could look like this. For this example, we are using the `OberauerLin_2017` data that is provided with the package. @@ -181,7 +153,7 @@ library(bmm) data <- OberauerLin_2017 ``` -For this quick example, we will show hot to setup fitting the Interference +For this quick example, we will show how to setup fitting the Interference Measurement Model to this data. If you want a detailed description of this model and and in depth explanation of the parameters estimated in the model, please have a look at `vignette("IMM")`. @@ -241,9 +213,9 @@ library(ggplot2) simData <- data.frame( x = bmm::rIMM(n = 500, - mu = c(0,-1.5,2.5,1), - dist = c(0, 2, 0.3, 1), - c = 1.5, a = 0.3, b = 0, s = 2, kappa = 10) + mu = c(0,-1.5,2.5,1), + dist = c(0, 2, 0.3, 1), + c = 1.5, a = 0.3, b = 0, s = 2, kappa = 10) ) ggplot(data = simData, aes(x = x)) + @@ -255,6 +227,44 @@ ggplot(data = simData, aes(x = x)) + scale_x_continuous(limits = c(-pi,pi)) ``` +## The general structure of the bmm package + +The main building block of the bmm package is that cognitive measurement models +can often be specified as distributional models for which the distributional +parameters of the generalized linear mixed model are a function of cognitive +measurement model parameters. These functions that translate the cognitive +measurement model parameters into distributional parameters is what we +implement in the bmm package. + + +```{r bmm-logic, echo=F, fig.cap="", out.width=600, fig.align = 'center'} +knitr::include_graphics("man/figures/README-bmmLogic.jpg") +``` + +As these function can become complicated and their implementation changes with +differences in experimental designs, the bmm package provides general +translation functions that eases the use of the cognitive measurement models for +end users. This way researchers that face challenges in writing their own STAN +code to implement such models themselves can still use these models in almost +any experimental design. + +Under the hood, the main `bmm` `fit_model()` function will then call the appropriate functions for the specified model +and will perform several steps: + +1. Configure the Sample (e.g., set up prallelization) +2. Check the information passed to the `fit_model()` function: + - if the model is installed and all required arguments were provided + - if a valid formula was passed + - if the data contains all necessary variables +3. Configure the called model (including specifying priors were necessary) +4. Calling `brms` and passing the specified arguments +5. Posprocessing the output and passing it to the user + +This process is illustrated in the Figure below: + +```{r fitModel, echo=F, fig.cap="", out.width=600, fig.align = 'center'} +knitr::include_graphics("man/figures/README-fitModel_process.jpg") +``` ## Contributing to the `bmm` package diff --git a/README.md b/README.md index c918c99a..a9143f2d 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,19 @@ cognitive processes underlying observed behavior, because they decompose observed behavior into several theoretically meaningful parameters that each represent distinct cognitive processes. +## Getting started + +See the following sections for more information on the `bmm` package: + +- [Available models](#available-models) +- [Installation](#installation) +- [Fitting models using the bmm](#fitting-models-using-the-bmm) +- [Exploring cogntive measurement + models](#exploring-cogntive-measurement-models) +- [The general structure of the bmm + package](#the-general-structure-of-the-bmm-package) +- [Contributing to the `bmm` package](#contributing-to-the-bmm-package) + ## Available models Currently the bmm package implements mainly models used in the domain of @@ -117,27 +130,9 @@ if (!requireNamespace("remotes")) { remotes::install_github("venpopov/bmm@v0.0.1") ``` -## The general structure of the bmm package - -The main building block of the bmm package is that cognitive measurement -models can often be specified as distributional models for which the -distributional parameters of the generalized linear mixed model are a -function of cognitive measurement model parameters. These functions that -translate the cognitive measurement model parameters into distributional -parameters is what we implement in the bmm package. - - - -As these function can become complicated and their implementation -changes with differences in experimental designs, the bmm package -provides general translation functions that eases the use of the -cognitive measurement models for end users. This way researchers that -face challenges in writing their own STAN code to implement such models -themselves can still use these models in almost any experimental design. - ## Fitting models using the bmm -The core function of the bmm package is the `fit_model` function. This +The core function of the bmm package is the `fit_model()` function. This function takes: 1. a linear model formula specifying how parameters of the model should @@ -156,23 +151,6 @@ Interference Measurement Model would look like this: ?IMMfull ``` -The function will then call the appropriate functions for the specified -model and will perform several steps: - -1. Configure the Sample (e.g., set up prallelization) -2. Check the information passed to the `fit_model` function: - - if the model is installed and all required arguments were provided - - if a valid formula was passed - - if the data contains all necessary variables -3. Configure the called model (including specifying priors were - necessary) -4. Calling `brms` and passing the specified arguments -5. Posprocessing the output and passing it to the user - -This process is illustrated in the Figure below: - - - A complete call to fit a model using bmm could look like this. For this example, we are using the `OberauerLin_2017` data that is provided with the package. @@ -182,7 +160,7 @@ library(bmm) data <- OberauerLin_2017 ``` -For this quick example, we will show hot to setup fitting the +For this quick example, we will show how to setup fitting the Interference Measurement Model to this data. If you want a detailed description of this model and and in depth explanation of the parameters estimated in the model, please have a look at `vignette("IMM")`. @@ -245,9 +223,9 @@ library(ggplot2) simData <- data.frame( x = bmm::rIMM(n = 500, - mu = c(0,-1.5,2.5,1), - dist = c(0, 2, 0.3, 1), - c = 1.5, a = 0.3, b = 0, s = 2, kappa = 10) + mu = c(0,-1.5,2.5,1), + dist = c(0, 2, 0.3, 1), + c = 1.5, a = 0.3, b = 0, s = 2, kappa = 10) ) ggplot(data = simData, aes(x = x)) + @@ -261,6 +239,42 @@ ggplot(data = simData, aes(x = x)) + +## The general structure of the bmm package + +The main building block of the bmm package is that cognitive measurement +models can often be specified as distributional models for which the +distributional parameters of the generalized linear mixed model are a +function of cognitive measurement model parameters. These functions that +translate the cognitive measurement model parameters into distributional +parameters is what we implement in the bmm package. + + + +As these function can become complicated and their implementation +changes with differences in experimental designs, the bmm package +provides general translation functions that eases the use of the +cognitive measurement models for end users. This way researchers that +face challenges in writing their own STAN code to implement such models +themselves can still use these models in almost any experimental design. + +Under the hood, the main `bmm` `fit_model()` function will then call the +appropriate functions for the specified model and will perform several +steps: + +1. Configure the Sample (e.g., set up prallelization) +2. Check the information passed to the `fit_model()` function: + - if the model is installed and all required arguments were provided + - if a valid formula was passed + - if the data contains all necessary variables +3. Configure the called model (including specifying priors were + necessary) +4. Calling `brms` and passing the specified arguments +5. Posprocessing the output and passing it to the user + +This process is illustrated in the Figure below: + + + ## Contributing to the `bmm` package Should be interested in contributing a model to the `bmm` package, you diff --git a/man/figures/README-unnamed-chunk-4-1.png b/man/figures/README-unnamed-chunk-4-1.png index 7144a535af733f917d7869528d037099c747d944..97a8a444aeb8daf2dc7ac699062a038875e8a40d 100644 GIT binary patch literal 6184 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