From d7e2066bfffd52c2a4b163eb56ca68d8d34f4d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98ystein=20S=C3=B8rensen?= Date: Mon, 3 Aug 2026 14:22:39 +0200 Subject: [PATCH 1/4] Point repository links to the ropensci organization Update GitHub repo URLs, issue tracker, CI badge and coverage badge following the transfer to github.com/ropensci/galamm. The link to LCBC-UiO/galamm-scripts is left unchanged, as that repository was not transferred. --- .github/CONTRIBUTING.md | 2 +- DESCRIPTION | 4 ++-- README.Rmd | 8 ++++---- README.md | 8 ++++---- codemeta.json | 10 +++++----- man/galamm-package.Rd | 4 ++-- vignettes-raw/lmm_heteroscedastic.Rmd | 2 +- vignettes/lmm_heteroscedastic.Rmd | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 547231d1..2a1da450 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -18,7 +18,7 @@ See our guide on [how to create a great issue](https://code-review.tidyverse.org ### Pull request process -* Fork the package and clone onto your computer. If you haven't done this before, we recommend using `usethis::create_from_github("LCBC-UiO/galamm", fork = TRUE)`. +* Fork the package and clone onto your computer. If you haven't done this before, we recommend using `usethis::create_from_github("ropensci/galamm", fork = TRUE)`. * Install all development dependencies with `devtools::install_dev_deps()`, and then make sure the package passes R CMD check by running `devtools::check()`. If R CMD check doesn't pass cleanly, it's a good idea to ask for help before continuing. diff --git a/DESCRIPTION b/DESCRIPTION index 6351469d..e8b5fa2d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -29,8 +29,8 @@ Description: Estimates generalized additive latent and ) and 'PLmixed' (Rockwood and Jeon (2019) ). License: GPL (>= 3) -URL: https://github.com/LCBC-UiO/galamm, https://lcbc-uio.github.io/galamm/ -BugReports: https://github.com/LCBC-UiO/galamm/issues +URL: https://github.com/ropensci/galamm, https://lcbc-uio.github.io/galamm/ +BugReports: https://github.com/ropensci/galamm/issues Encoding: UTF-8 Imports: gratia, diff --git a/README.Rmd b/README.Rmd index a7068562..b8491fde 100644 --- a/README.Rmd +++ b/README.Rmd @@ -24,8 +24,8 @@ knitr::opts_chunk$set( [![CRAN status](https://www.r-pkg.org/badges/version/galamm)](https://cran.r-project.org/package=galamm) [![Status at rOpenSci Software Peer Review](https://badges.ropensci.org/615_status.svg)](https://github.com/ropensci/software-review/issues/615) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) -[![R-CMD-check](https://github.com/LCBC-UiO/galamm/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/LCBC-UiO/galamm/actions/workflows/R-CMD-check.yaml) -[![Codecov test coverage](https://codecov.io/gh/LCBC-UiO/galamm/branch/main/graph/badge.svg)](https://app.codecov.io/gh/LCBC-UiO/galamm?branch=main) +[![R-CMD-check](https://github.com/ropensci/galamm/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/galamm/actions/workflows/R-CMD-check.yaml) +[![Codecov test coverage](https://codecov.io/gh/ropensci/galamm/branch/main/graph/badge.svg)](https://app.codecov.io/gh/ropensci/galamm?branch=main) ```{r srr-tags1, eval = FALSE, echo = FALSE} @@ -83,7 +83,7 @@ You can install the development version of galamm from [GitHub](https://github.c ``` r # install.packages("remotes") -remotes::install_github("LCBC-UiO/galamm") +remotes::install_github("ropensci/galamm") ``` ## Examples @@ -171,6 +171,6 @@ Some parts of the code base for galamm has been derived from internal functions ## Contributing -Contributions are very welcome, see [CONTRIBUTING.md](https://github.com/LCBC-UiO/galamm/blob/main/.github/CONTRIBUTING.md) for general guidelines. +Contributions are very welcome, see [CONTRIBUTING.md](https://github.com/ropensci/galamm/blob/main/.github/CONTRIBUTING.md) for general guidelines. ## References diff --git a/README.md b/README.md index b5c76271..8c77db13 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ Review](https://badges.ropensci.org/615_status.svg)](https://github.com/ropensci [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) -[![R-CMD-check](https://github.com/LCBC-UiO/galamm/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/LCBC-UiO/galamm/actions/workflows/R-CMD-check.yaml) +[![R-CMD-check](https://github.com/ropensci/galamm/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/galamm/actions/workflows/R-CMD-check.yaml) [![Codecov test -coverage](https://codecov.io/gh/LCBC-UiO/galamm/branch/main/graph/badge.svg)](https://app.codecov.io/gh/LCBC-UiO/galamm?branch=main) +coverage](https://codecov.io/gh/ropensci/galamm/branch/main/graph/badge.svg)](https://app.codecov.io/gh/ropensci/galamm?branch=main) galamm estimates generalized additive latent and mixed models (GALAMMs). @@ -121,7 +121,7 @@ You can install the development version of galamm from ``` r # install.packages("remotes") -remotes::install_github("LCBC-UiO/galamm") +remotes::install_github("ropensci/galamm") ``` ## Examples @@ -273,7 +273,7 @@ contributor to this package, please let me know, and I will remove you. ## Contributing Contributions are very welcome, see -[CONTRIBUTING.md](https://github.com/LCBC-UiO/galamm/blob/main/.github/CONTRIBUTING.md) +[CONTRIBUTING.md](https://github.com/ropensci/galamm/blob/main/.github/CONTRIBUTING.md) for general guidelines. ## References diff --git a/codemeta.json b/codemeta.json index f3be4079..d46365c1 100644 --- a/codemeta.json +++ b/codemeta.json @@ -5,8 +5,8 @@ "description": "Estimates generalized additive latent and mixed models using maximum marginal likelihood, as defined in Sorensen et al. (2023) , which is an extension of Rabe-Hesketh and Skrondal (2004)'s unifying framework for multilevel latent variable modeling . Efficient computation is done using sparse matrix methods, Laplace approximation, and automatic differentiation. The framework includes generalized multilevel models with heteroscedastic residuals, mixed response types, factor loadings, smoothing splines, crossed random effects, and combinations thereof. Syntax for model formulation is close to 'lme4' (Bates et al. (2015) ) and 'PLmixed' (Rockwood and Jeon (2019) ).", "name": "galamm: Generalized Additive Latent and Mixed Models", "relatedLink": ["https://lcbc-uio.github.io/galamm/", "https://CRAN.R-project.org/package=galamm"], - "codeRepository": "https://github.com/LCBC-UiO/galamm", - "issueTracker": "https://github.com/LCBC-UiO/galamm/issues", + "codeRepository": "https://github.com/ropensci/galamm", + "issueTracker": "https://github.com/ropensci/galamm/issues", "license": "https://spdx.org/licenses/GPL-3.0", "version": "0.4.0", "programmingLanguage": { @@ -364,9 +364,9 @@ } } ], - "releaseNotes": "https://github.com/LCBC-UiO/galamm/blob/main/NEWS.md", - "readme": "https://github.com/LCBC-UiO/galamm/blob/main/README.md", - "contIntegration": ["https://github.com/LCBC-UiO/galamm/actions/workflows/R-CMD-check.yaml", "https://app.codecov.io/gh/LCBC-UiO/galamm?branch=main"], + "releaseNotes": "https://github.com/ropensci/galamm/blob/main/NEWS.md", + "readme": "https://github.com/ropensci/galamm/blob/main/README.md", + "contIntegration": ["https://github.com/ropensci/galamm/actions/workflows/R-CMD-check.yaml", "https://app.codecov.io/gh/ropensci/galamm?branch=main"], "developmentStatus": "https://www.repostatus.org/#active", "review": { "@type": "Review", diff --git a/man/galamm-package.Rd b/man/galamm-package.Rd index 7f678fe3..d490b41f 100644 --- a/man/galamm-package.Rd +++ b/man/galamm-package.Rd @@ -15,9 +15,9 @@ Estimates generalized additive latent and mixed models using maximum marginal li \seealso{ Useful links: \itemize{ - \item \url{https://github.com/LCBC-UiO/galamm} + \item \url{https://github.com/ropensci/galamm} \item \url{https://lcbc-uio.github.io/galamm/} - \item Report bugs at \url{https://github.com/LCBC-UiO/galamm/issues} + \item Report bugs at \url{https://github.com/ropensci/galamm/issues} } } diff --git a/vignettes-raw/lmm_heteroscedastic.Rmd b/vignettes-raw/lmm_heteroscedastic.Rmd index fefbc643..f630fec1 100644 --- a/vignettes-raw/lmm_heteroscedastic.Rmd +++ b/vignettes-raw/lmm_heteroscedastic.Rmd @@ -33,7 +33,7 @@ $$ where subscript $i$ refers to the $i$th elementary unit of observation, i.e., the $i$th row in the dataframe. $g(i)$ refers to the group to which the $i$th observation belongs, with each grouping having a separately estimated residual variance, $\epsilon_{g} \sim N(0, \sigma_{g}^{2})$. -In the future, we plan to also support other types of residual terms, including autocorrelation and residuals that depend on continuous variables. Such features are currently supported by the R packages [nlme](https://cran.r-project.org/package=nlme) [@pinheiroMixedEffectsModelsSPLUS2000], [mgcv](https://cran.r-project.org/package=mgcv) [@woodGeneralizedAdditiveModels2017], and [gamlss](https://cran.r-project.org/package=gamlss) [@rigbyGeneralizedAdditiveModels2005], however, of these only nlme provides computationally efficient estimation of mixed effects models with a large number of grouping levels, and only with strictly nested groups. If you are aware of other packages implementing such functionality, please [let us know](https://github.com/LCBC-UiO/galamm/issues). +In the future, we plan to also support other types of residual terms, including autocorrelation and residuals that depend on continuous variables. Such features are currently supported by the R packages [nlme](https://cran.r-project.org/package=nlme) [@pinheiroMixedEffectsModelsSPLUS2000], [mgcv](https://cran.r-project.org/package=mgcv) [@woodGeneralizedAdditiveModels2017], and [gamlss](https://cran.r-project.org/package=gamlss) [@rigbyGeneralizedAdditiveModels2005], however, of these only nlme provides computationally efficient estimation of mixed effects models with a large number of grouping levels, and only with strictly nested groups. If you are aware of other packages implementing such functionality, please [let us know](https://github.com/ropensci/galamm/issues). ## Group-Wise Heteroscedasticity diff --git a/vignettes/lmm_heteroscedastic.Rmd b/vignettes/lmm_heteroscedastic.Rmd index a34cf9fe..5f5a1c37 100644 --- a/vignettes/lmm_heteroscedastic.Rmd +++ b/vignettes/lmm_heteroscedastic.Rmd @@ -27,7 +27,7 @@ $$ where subscript $i$ refers to the $i$th elementary unit of observation, i.e., the $i$th row in the dataframe. $g(i)$ refers to the group to which the $i$th observation belongs, with each grouping having a separately estimated residual variance, $\epsilon_{g} \sim N(0, \sigma_{g}^{2})$. -In the future, we plan to also support other types of residual terms, including autocorrelation and residuals that depend on continuous variables. Such features are currently supported by the R packages [nlme](https://cran.r-project.org/package=nlme) [@pinheiroMixedEffectsModelsSPLUS2000], [mgcv](https://cran.r-project.org/package=mgcv) [@woodGeneralizedAdditiveModels2017], and [gamlss](https://cran.r-project.org/package=gamlss) [@rigbyGeneralizedAdditiveModels2005], however, of these only nlme provides computationally efficient estimation of mixed effects models with a large number of grouping levels, and only with strictly nested groups. If you are aware of other packages implementing such functionality, please [let us know](https://github.com/LCBC-UiO/galamm/issues). +In the future, we plan to also support other types of residual terms, including autocorrelation and residuals that depend on continuous variables. Such features are currently supported by the R packages [nlme](https://cran.r-project.org/package=nlme) [@pinheiroMixedEffectsModelsSPLUS2000], [mgcv](https://cran.r-project.org/package=mgcv) [@woodGeneralizedAdditiveModels2017], and [gamlss](https://cran.r-project.org/package=gamlss) [@rigbyGeneralizedAdditiveModels2005], however, of these only nlme provides computationally efficient estimation of mixed effects models with a large number of grouping levels, and only with strictly nested groups. If you are aware of other packages implementing such functionality, please [let us know](https://github.com/ropensci/galamm/issues). ## Group-Wise Heteroscedasticity From 0b099bf63a1ebf4822d0ff9f2276c00182dcf2fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98ystein=20S=C3=B8rensen?= Date: Mon, 3 Aug 2026 14:30:27 +0200 Subject: [PATCH 2/4] Complete remaining rOpenSci transfer steps Move the package documentation to rOpenSci's central docs building and adjust the remaining project files accordingly. - Point all website links at https://docs.ropensci.org/galamm/ and list the docs URL before the repository URL in DESCRIPTION. - Drop the bootstrap styling tweak from the pkgdown config, since styling now comes from rOpenSci's rotemplate, and request MathJax explicitly because the vignettes make heavy use of LaTeX maths. - Replace the pkgdown deployment workflow with the rotemplate test-docs workflow, which builds the site the same way rOpenSci does but does not publish it. - Remove the bundled code of conduct, as rOpenSci's code of conduct now applies, and link to it from the contributing guidelines. - Document installation from the rOpenSci R-universe in the README. - Bump the version to 0.4.1 and describe these changes in news.md. --- .Rbuildignore | 2 - .github/CONTRIBUTING.md | 4 +- .github/workflows/pkgdown.yaml | 46 ------- .github/workflows/test-docs.yaml | 21 +++ CODE_OF_CONDUCT.md | 126 ------------------ DESCRIPTION | 4 +- README.Rmd | 26 ++-- README.md | 30 +++-- _pkgdown.yml | 9 +- codemeta.json | 6 +- man/galamm-package.Rd | 2 +- news.md | 21 +++ vignettes-raw/glmm_factor.Rmd | 2 +- vignettes-raw/latent_observed_interaction.Rmd | 4 +- vignettes-raw/lmm_heteroscedastic.Rmd | 2 +- vignettes-raw/mixed_response.Rmd | 4 +- vignettes-raw/optimization.Rmd | 2 +- vignettes-raw/posterior_sampling.Rmd | 2 +- vignettes-raw/scaling.Rmd | 8 +- vignettes-raw/semiparametric.Rmd | 4 +- vignettes/galamm.Rmd | 14 +- vignettes/glmm_factor.Rmd | 2 +- vignettes/latent_observed_interaction.Rmd | 4 +- vignettes/lmm_heteroscedastic.Rmd | 2 +- vignettes/mixed_response.Rmd | 4 +- vignettes/optimization.Rmd | 2 +- vignettes/posterior_sampling.Rmd | 2 +- vignettes/scaling.Rmd | 8 +- vignettes/semiparametric.Rmd | 4 +- 29 files changed, 126 insertions(+), 241 deletions(-) delete mode 100644 .github/workflows/pkgdown.yaml create mode 100644 .github/workflows/test-docs.yaml delete mode 100644 CODE_OF_CONDUCT.md diff --git a/.Rbuildignore b/.Rbuildignore index f725f03c..61b44076 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -14,8 +14,6 @@ ^cran-comments\.md$ ^news\.md$ ^codemeta\.json$ -^CODE_OF_CONDUCT\.md$ -^CODE_OF_CONDUCT\.html$ rebuild-long-running-vignettes.R update_autodiff.sh diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 2a1da450..916f29c3 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -43,8 +43,8 @@ See our guide on [how to create a great issue](https://code-review.tidyverse.org ## Code of Conduct Please note that the galamm project is released with a -[Contributor Code of Conduct](CODE_OF_CONDUCT.md). By contributing to this -project you agree to abide by its terms. +[Contributor Code of Conduct](https://ropensci.org/code-of-conduct/). By +contributing to this project you agree to abide by its terms. ## Roadmap diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml deleted file mode 100644 index 0b260216..00000000 --- a/.github/workflows/pkgdown.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples -# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help -on: - push: - branches: [main, master] - pull_request: - branches: [main, master] - release: - types: [published] - workflow_dispatch: - -name: pkgdown - -jobs: - pkgdown: - runs-on: ubuntu-latest - # Only restrict concurrency for non-PR jobs - concurrency: - group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - steps: - - uses: actions/checkout@v2 - - - uses: r-lib/actions/setup-pandoc@v2 - - - uses: r-lib/actions/setup-r@v2 - with: - use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v2 - with: - extra-packages: any::pkgdown, local::. - needs: website - - - name: Build site - run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) - shell: Rscript {0} - - - name: Deploy to GitHub pages 🚀 - if: github.event_name != 'pull_request' - uses: JamesIves/github-pages-deploy-action@4.1.4 - with: - clean: false - branch: gh-pages - folder: docs diff --git a/.github/workflows/test-docs.yaml b/.github/workflows/test-docs.yaml new file mode 100644 index 00000000..30936078 --- /dev/null +++ b/.github/workflows/test-docs.yaml @@ -0,0 +1,21 @@ +# The pkgdown website for galamm is built centrally by rOpenSci and published +# at https://docs.ropensci.org/galamm/, so this package no longer deploys a +# site of its own. This workflow runs the very same build script that rOpenSci +# uses, so that problems with the documentation are caught here rather than +# after merging. The rendered site is stored as a build artifact. +# +# See https://github.com/ropensci-org/rotemplate/ for details. +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +name: Test-docs + +jobs: + Test-docs: + runs-on: ubuntu-latest + steps: + - uses: ropensci-org/rotemplate@main diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index f56d558f..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,126 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socioeconomic status, -nationality, personal appearance, race, caste, color, religion, or sexual -identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the overall - community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or advances of - any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email address, - without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at oystein.sorensen.1985@gmail.com. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series of -actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or permanent -ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within the -community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.1, available at -. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][https://github.com/mozilla/inclusion]. - -For answers to common questions about this code of conduct, see the FAQ at -. Translations are available at . - -[homepage]: https://www.contributor-covenant.org diff --git a/DESCRIPTION b/DESCRIPTION index e8b5fa2d..24b2c1dd 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: galamm Title: Generalized Additive Latent and Mixed Models -Version: 0.4.0 +Version: 0.4.1 Authors@R: c( person(given = "Øystein", family = "Sørensen", @@ -29,7 +29,7 @@ Description: Estimates generalized additive latent and ) and 'PLmixed' (Rockwood and Jeon (2019) ). License: GPL (>= 3) -URL: https://github.com/ropensci/galamm, https://lcbc-uio.github.io/galamm/ +URL: https://docs.ropensci.org/galamm/, https://github.com/ropensci/galamm BugReports: https://github.com/ropensci/galamm/issues Encoding: UTF-8 Imports: diff --git a/README.Rmd b/README.Rmd index b8491fde..853ed606 100644 --- a/README.Rmd +++ b/README.Rmd @@ -18,7 +18,7 @@ knitr::opts_chunk$set( ) ``` -# Generalized Additive Latent and Mixed Models galamm website +# Generalized Additive Latent and Mixed Models galamm website [![CRAN status](https://www.r-pkg.org/badges/version/galamm)](https://cran.r-project.org/package=galamm) @@ -47,7 +47,7 @@ Some typical usage examples include: - Analyzing data with mixed response types, e.g., when a latent trait is measured with a combination of continuous and binary responses. - Avoiding measurement error bias by utilizing replicate measurements of covariates of interest. -To get started, take a look at the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html). +To get started, take a look at the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html). ## What Can the Package Do? @@ -55,12 +55,12 @@ Many applications, particularly in the social sciences, require modeling capabil The goal of galamm is to enable estimation of models with an arbitrary number of grouping levels, both crossed and hierarchical, and any combination of the following features (click the links to go to the relevant vignette): -- [Linear mixed models with factor structures](https://lcbc-uio.github.io/galamm/articles/lmm_factor.html). -- [Generalized linear mixed models with factor structures](https://lcbc-uio.github.io/galamm/articles/glmm_factor.html). -- [Linear mixed models with heteroscedastic residuals](https://lcbc-uio.github.io/galamm/articles/lmm_heteroscedastic.html). -- [Mixed models with mixed response types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html). -- [Generalized additive mixed models with factor structures](https://lcbc-uio.github.io/galamm/articles/semiparametric.html). -- [Interactions between latent and observed covariates](https://lcbc-uio.github.io/galamm/articles/latent_observed_interaction.html). +- [Linear mixed models with factor structures](https://docs.ropensci.org/galamm/articles/lmm_factor.html). +- [Generalized linear mixed models with factor structures](https://docs.ropensci.org/galamm/articles/glmm_factor.html). +- [Linear mixed models with heteroscedastic residuals](https://docs.ropensci.org/galamm/articles/lmm_heteroscedastic.html). +- [Mixed models with mixed response types](https://docs.ropensci.org/galamm/articles/mixed_response.html). +- [Generalized additive mixed models with factor structures](https://docs.ropensci.org/galamm/articles/semiparametric.html). +- [Interactions between latent and observed covariates](https://docs.ropensci.org/galamm/articles/latent_observed_interaction.html). ```{r srr-tags2, eval = FALSE, echo = FALSE} #' @srrstats {G1.6} Code for comparing the performance of galamm to the of PLmixed for example models is provided in the vignette on linear mixed models with factor structures. @@ -69,7 +69,7 @@ The goal of galamm is to enable estimation of models with an arbitrary number of Random effects are defined using [lme4](https://cran.r-project.org/package=lme4) syntax, and the syntax for factor structures are close to that of [PLmixed](https://cran.r-project.org/package=PLmixed) [@rockwoodEstimatingComplexMeasurement2019]. However, for the types of models supported by both PLmixed and galamm, galamm is usually considerably faster. Smooth terms, as in generalized additive mixed models, use the same syntax as [mgcv](https://cran.r-project.org/package=mgcv). -For most users, it should not be necessary to think about how the actual computations are performed, although they are detailed in the [optimization vignette](https://lcbc-uio.github.io/galamm/articles/optimization.html). In short, the core computations are done using sparse matrix methods supported by [RcppEigen](https://cran.r-project.org/package=RcppEigen) [@batesFastElegantNumerical2013] and automatic differentiation using the C++ library [autodiff](https://autodiff.github.io/) [@lealAutodiffModernFast2018]. Scaling of the algorithm is investigated further in [the vignette on computational scaling](https://lcbc-uio.github.io/galamm/articles/scaling.html). +For most users, it should not be necessary to think about how the actual computations are performed, although they are detailed in the [optimization vignette](https://docs.ropensci.org/galamm/articles/optimization.html). In short, the core computations are done using sparse matrix methods supported by [RcppEigen](https://cran.r-project.org/package=RcppEigen) [@batesFastElegantNumerical2013] and automatic differentiation using the C++ library [autodiff](https://autodiff.github.io/) [@lealAutodiffModernFast2018]. Scaling of the algorithm is investigated further in [the vignette on computational scaling](https://docs.ropensci.org/galamm/articles/scaling.html). ## Installation @@ -79,7 +79,13 @@ Install the package from CRAN using install.packages("galamm") ``` -You can install the development version of galamm from [GitHub](https://github.com/) with: +You can install the development version of galamm from the [rOpenSci R-universe](https://ropensci.r-universe.dev/galamm) using + +``` r +install.packages("galamm", repos = c("https://ropensci.r-universe.dev", "https://cloud.r-project.org")) +``` + +or from [GitHub](https://github.com/) with: ``` r # install.packages("remotes") diff --git a/README.md b/README.md index 8c77db13..8984a893 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# Generalized Additive Latent and Mixed Models galamm website +# Generalized Additive Latent and Mixed Models galamm website @@ -41,7 +41,7 @@ Some typical usage examples include: covariates of interest. To get started, take a look at the [introductory -vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html). +vignette](https://docs.ropensci.org/galamm/articles/galamm.html). ## What Can the Package Do? @@ -73,17 +73,17 @@ combination of the following features (click the links to go to the relevant vignette): - [Linear mixed models with factor - structures](https://lcbc-uio.github.io/galamm/articles/lmm_factor.html). + structures](https://docs.ropensci.org/galamm/articles/lmm_factor.html). - [Generalized linear mixed models with factor - structures](https://lcbc-uio.github.io/galamm/articles/glmm_factor.html). + structures](https://docs.ropensci.org/galamm/articles/glmm_factor.html). - [Linear mixed models with heteroscedastic - residuals](https://lcbc-uio.github.io/galamm/articles/lmm_heteroscedastic.html). + residuals](https://docs.ropensci.org/galamm/articles/lmm_heteroscedastic.html). - [Mixed models with mixed response - types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html). + types](https://docs.ropensci.org/galamm/articles/mixed_response.html). - [Generalized additive mixed models with factor - structures](https://lcbc-uio.github.io/galamm/articles/semiparametric.html). + structures](https://docs.ropensci.org/galamm/articles/semiparametric.html). - [Interactions between latent and observed - covariates](https://lcbc-uio.github.io/galamm/articles/latent_observed_interaction.html). + covariates](https://docs.ropensci.org/galamm/articles/latent_observed_interaction.html). Random effects are defined using [lme4](https://cran.r-project.org/package=lme4) syntax, and the syntax @@ -98,7 +98,7 @@ mixed models, use the same syntax as For most users, it should not be necessary to think about how the actual computations are performed, although they are detailed in the [optimization -vignette](https://lcbc-uio.github.io/galamm/articles/optimization.html). +vignette](https://docs.ropensci.org/galamm/articles/optimization.html). In short, the core computations are done using sparse matrix methods supported by [RcppEigen](https://cran.r-project.org/package=RcppEigen) ([Bates and Eddelbuettel 2013](#ref-batesFastElegantNumerical2013)) and @@ -106,7 +106,7 @@ automatic differentiation using the C++ library [autodiff](https://autodiff.github.io/) ([Leal 2018](#ref-lealAutodiffModernFast2018)). Scaling of the algorithm is investigated further in [the vignette on computational -scaling](https://lcbc-uio.github.io/galamm/articles/scaling.html). +scaling](https://docs.ropensci.org/galamm/articles/scaling.html). ## Installation @@ -116,8 +116,14 @@ Install the package from CRAN using install.packages("galamm") ``` -You can install the development version of galamm from -[GitHub](https://github.com/) with: +You can install the development version of galamm from the [rOpenSci +R-universe](https://ropensci.r-universe.dev/galamm) using + +``` r +install.packages("galamm", repos = c("https://ropensci.r-universe.dev", "https://cloud.r-project.org")) +``` + +or from [GitHub](https://github.com/) with: ``` r # install.packages("remotes") diff --git a/_pkgdown.yml b/_pkgdown.yml index d0ef12d1..8a0d704e 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -1,6 +1,11 @@ -url: https://lcbc-uio.github.io/galamm/ +url: https://docs.ropensci.org/galamm/ + +# Styling is provided centrally by rOpenSci's rotemplate package, so no +# template customisation is set here. MathJax is requested explicitly because +# the vignettes rely heavily on LaTeX maths, which pkgdown's default MathML +# rendering does not display reliably across browsers. template: - bootstrap: 5 + math-rendering: mathjax articles: - title: Get started diff --git a/codemeta.json b/codemeta.json index d46365c1..5cb61881 100644 --- a/codemeta.json +++ b/codemeta.json @@ -4,11 +4,11 @@ "identifier": "galamm", "description": "Estimates generalized additive latent and mixed models using maximum marginal likelihood, as defined in Sorensen et al. (2023) , which is an extension of Rabe-Hesketh and Skrondal (2004)'s unifying framework for multilevel latent variable modeling . Efficient computation is done using sparse matrix methods, Laplace approximation, and automatic differentiation. The framework includes generalized multilevel models with heteroscedastic residuals, mixed response types, factor loadings, smoothing splines, crossed random effects, and combinations thereof. Syntax for model formulation is close to 'lme4' (Bates et al. (2015) ) and 'PLmixed' (Rockwood and Jeon (2019) ).", "name": "galamm: Generalized Additive Latent and Mixed Models", - "relatedLink": ["https://lcbc-uio.github.io/galamm/", "https://CRAN.R-project.org/package=galamm"], + "relatedLink": ["https://docs.ropensci.org/galamm/", "https://CRAN.R-project.org/package=galamm"], "codeRepository": "https://github.com/ropensci/galamm", "issueTracker": "https://github.com/ropensci/galamm/issues", "license": "https://spdx.org/licenses/GPL-3.0", - "version": "0.4.0", + "version": "0.4.1", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", @@ -364,7 +364,7 @@ } } ], - "releaseNotes": "https://github.com/ropensci/galamm/blob/main/NEWS.md", + "releaseNotes": "https://github.com/ropensci/galamm/blob/main/news.md", "readme": "https://github.com/ropensci/galamm/blob/main/README.md", "contIntegration": ["https://github.com/ropensci/galamm/actions/workflows/R-CMD-check.yaml", "https://app.codecov.io/gh/ropensci/galamm?branch=main"], "developmentStatus": "https://www.repostatus.org/#active", diff --git a/man/galamm-package.Rd b/man/galamm-package.Rd index d490b41f..f7b46736 100644 --- a/man/galamm-package.Rd +++ b/man/galamm-package.Rd @@ -15,8 +15,8 @@ Estimates generalized additive latent and mixed models using maximum marginal li \seealso{ Useful links: \itemize{ + \item \url{https://docs.ropensci.org/galamm/} \item \url{https://github.com/ropensci/galamm} - \item \url{https://lcbc-uio.github.io/galamm/} \item Report bugs at \url{https://github.com/ropensci/galamm/issues} } diff --git a/news.md b/news.md index 6c234ebf..78e45293 100644 --- a/news.md +++ b/news.md @@ -1,3 +1,24 @@ +# galamm 0.4.1 + +galamm has been peer reviewed and accepted by rOpenSci, and the repository has +moved to https://github.com/ropensci/galamm. This release contains the changes +made during and after that review. There are no changes to the user-facing +model fitting functions. + +- All links to the source repository, including the continuous integration and + test coverage badges, now point to the repository under the rOpenSci + organization. +- The package website has moved to https://docs.ropensci.org/galamm/, and is + now built centrally by rOpenSci. All documentation links have been updated + accordingly, and the package no longer deploys a website of its own. +- The pkgdown configuration now requests MathJax explicitly, so that the + mathematical notation in the vignettes renders reliably on the new website. +- The bundled code of conduct has been removed, since rOpenSci's code of + conduct at https://ropensci.org/code-of-conduct/ now applies. The + contributing guidelines link to it instead. +- The README describes how to install development versions from the rOpenSci + R-universe. + # galamm 0.3.0 (development versions) - Vignettes are updated to better demonstrate model checking possibilities. diff --git a/vignettes-raw/glmm_factor.Rmd b/vignettes-raw/glmm_factor.Rmd index a7a19d92..91613ba9 100644 --- a/vignettes-raw/glmm_factor.Rmd +++ b/vignettes-raw/glmm_factor.Rmd @@ -38,7 +38,7 @@ library(PLmixed) head(IRTsim) ``` -Each student is identified by a student id `sid`, and each school with a school id given by the `school` variable. For each student, five item measurements have been made. We assume that the student's performance depends both on the students ability as well as on the school the student attends. Having the outline of GALAMMs from the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html) in mind, we assume a binomial response model with a logit link, yielding for the $i$th measurement of the $j$th student in the $k$th school, +Each student is identified by a student id `sid`, and each school with a school id given by the `school` variable. For each student, five item measurements have been made. We assume that the student's performance depends both on the students ability as well as on the school the student attends. Having the outline of GALAMMs from the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html) in mind, we assume a binomial response model with a logit link, yielding for the $i$th measurement of the $j$th student in the $k$th school, $$ \text{P}(y_{ijk} = 1 | \mathbf{x}_{ijk}, \boldsymbol{\eta}_{jk}) = \frac{\exp(\nu_{ijk})}{1 + \exp(\nu_{ijk})} diff --git a/vignettes-raw/latent_observed_interaction.Rmd b/vignettes-raw/latent_observed_interaction.Rmd index ba433d6f..6b5cb8cb 100644 --- a/vignettes-raw/latent_observed_interaction.Rmd +++ b/vignettes-raw/latent_observed_interaction.Rmd @@ -25,7 +25,7 @@ knitr::opts_chunk$set( library(galamm) ``` -This vignette describes how `galamm` can be used to model interactions between latent and observed variables. The models described here can be considered extensions of the covariate measurement error model described in the [vignette on mixed response types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html#covariate-measurement-error-model), by allowing the latent variables to interaction with observed variables. +This vignette describes how `galamm` can be used to model interactions between latent and observed variables. The models described here can be considered extensions of the covariate measurement error model described in the [vignette on mixed response types](https://docs.ropensci.org/galamm/articles/mixed_response.html#covariate-measurement-error-model), by allowing the latent variables to interaction with observed variables. ## Linear Mixed Model with Latent Covariates @@ -68,7 +68,7 @@ x \beta + \boldsymbol{\epsilon}. $$ -In this equation $\boldsymbol{\beta}_{0} \in \mathbb{R}^{3}$ is a vector of intercepts, $\eta$ is a latent variable, the loading of the latent variable onto the first measurement $y_{1}$ is fixed to 1 for identifiability, $\lambda_{2}$ is the loading of the latent variable onto the second measurement $y_{2}$, $\lambda_{3}$ is the main effect of the latent variable on the response of interest $y_{3}$, $\beta$ is the effect of the observed covariate $x$ on $y_{3}$, and $\lambda_{4}$ is the interaction effect of $x$ and $\eta$ on $y_{3}$. We assume that the residuals $\boldsymbol{\epsilon}$ are independently and identically normally distributed; this assumption is valid in this simulated case, but note that since the response $y_{3}$ is qualitatively different from the measurements $y_{1}$ and $y_{2}$, this assumption will in general not hold, and a [heteroscedastic measurement model](https://lcbc-uio.github.io/galamm/articles/lmm_heteroscedastic.html) should be used, or a [model with mixed response types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html). For a more detailed explanation of this way of formulating latent variable models in matrix form we refer to the first four pages of @rockwoodEstimatingComplexMeasurement2019. +In this equation $\boldsymbol{\beta}_{0} \in \mathbb{R}^{3}$ is a vector of intercepts, $\eta$ is a latent variable, the loading of the latent variable onto the first measurement $y_{1}$ is fixed to 1 for identifiability, $\lambda_{2}$ is the loading of the latent variable onto the second measurement $y_{2}$, $\lambda_{3}$ is the main effect of the latent variable on the response of interest $y_{3}$, $\beta$ is the effect of the observed covariate $x$ on $y_{3}$, and $\lambda_{4}$ is the interaction effect of $x$ and $\eta$ on $y_{3}$. We assume that the residuals $\boldsymbol{\epsilon}$ are independently and identically normally distributed; this assumption is valid in this simulated case, but note that since the response $y_{3}$ is qualitatively different from the measurements $y_{1}$ and $y_{2}$, this assumption will in general not hold, and a [heteroscedastic measurement model](https://docs.ropensci.org/galamm/articles/lmm_heteroscedastic.html) should be used, or a [model with mixed response types](https://docs.ropensci.org/galamm/articles/mixed_response.html). For a more detailed explanation of this way of formulating latent variable models in matrix form we refer to the first four pages of @rockwoodEstimatingComplexMeasurement2019. The structural model is simply $\eta = \zeta \sim N(0, \psi)$, where $\psi$ is its variance. diff --git a/vignettes-raw/lmm_heteroscedastic.Rmd b/vignettes-raw/lmm_heteroscedastic.Rmd index f630fec1..b161dbe7 100644 --- a/vignettes-raw/lmm_heteroscedastic.Rmd +++ b/vignettes-raw/lmm_heteroscedastic.Rmd @@ -25,7 +25,7 @@ knitr::opts_chunk$set( library(galamm) ``` -At the moment, galamm supports group-wise heteroscedasticity in Gaussian response models. Referring to the model formulation outlined in the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html), the response model and nonlinear predictor can be easily combined in this particular case, to give +At the moment, galamm supports group-wise heteroscedasticity in Gaussian response models. Referring to the model formulation outlined in the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html), the response model and nonlinear predictor can be easily combined in this particular case, to give $$ y_{i} = \sum_{s=1}^{S} f_{s}\left(\mathbf{x}_{i}\right) + \sum_{l=2}^{L}\sum_{m=1}^{M_{l}} \eta_{m}^{(l)} \mathbf{z}^{(l)}_{im}{}^{'}\boldsymbol{\lambda}_{m}^{(l)} + \epsilon_{g(i)}, diff --git a/vignettes-raw/mixed_response.Rmd b/vignettes-raw/mixed_response.Rmd index d02f6c8a..52004e76 100644 --- a/vignettes-raw/mixed_response.Rmd +++ b/vignettes-raw/mixed_response.Rmd @@ -36,7 +36,7 @@ We start with the `mresp` dataset, which comes with the package. The variable "i head(mresp) ``` -In terms of the GALAMM defined in the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html), and for simplicity assuming we use canonical link functions, we have the response model +In terms of the GALAMM defined in the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html), and for simplicity assuming we use canonical link functions, we have the response model $$ f\left(y_{ij} | \nu_{ij}, \phi\right) = \exp \left( \frac{y_{ij}\nu_{ij} - b\left(\nu_{ij}\right)}{\phi} + c\left(y_{ij}, \phi\right) \right) @@ -101,7 +101,7 @@ summary(mixed_resp) ### Mixed Response and Heteroscedastic Residuals -Mixed response models can be combined with heteroscedastic residuals, which are described in the vignette on [linear mixed models with heteroscedastic residuals](https://lcbc-uio.github.io/galamm/articles/lmm_heteroscedastic.html). However, some care is needed in this case. We illustrate with the dataset `mresp_hsced`, whose first few lines are shown below: +Mixed response models can be combined with heteroscedastic residuals, which are described in the vignette on [linear mixed models with heteroscedastic residuals](https://docs.ropensci.org/galamm/articles/lmm_heteroscedastic.html). However, some care is needed in this case. We illustrate with the dataset `mresp_hsced`, whose first few lines are shown below: ```{r} head(mresp_hsced) diff --git a/vignettes-raw/optimization.Rmd b/vignettes-raw/optimization.Rmd index aa6f7eb8..4d502f5a 100644 --- a/vignettes-raw/optimization.Rmd +++ b/vignettes-raw/optimization.Rmd @@ -39,7 +39,7 @@ At convergence, the Hessian matrix of second derivatives is computed exactly, ag ## Modifying the L-BFGS-B algorithm -We will illustrate some ways of modifying the optimization procedure with the covariate measurement model example shown in the [vignette on models with mixed response types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html). Here we start by simply setting up what we need to fit the model. +We will illustrate some ways of modifying the optimization procedure with the covariate measurement model example shown in the [vignette on models with mixed response types](https://docs.ropensci.org/galamm/articles/mixed_response.html). Here we start by simply setting up what we need to fit the model. ```{r} loading_matrix <- matrix(c(1, 1, NA), ncol = 1) diff --git a/vignettes-raw/posterior_sampling.Rmd b/vignettes-raw/posterior_sampling.Rmd index 127eeffc..592b5613 100644 --- a/vignettes-raw/posterior_sampling.Rmd +++ b/vignettes-raw/posterior_sampling.Rmd @@ -27,7 +27,7 @@ library(galamm) Sampling from the empirical Bayes posterior distribution can be a convenient way of obtaining confidence bands for nonlinear functions of the estimated parameters. More background can be found in [this blog post by Gavin Simpson](https://fromthebottomoftheheap.net/2016/12/15/simultaneous-interval-revisited/) and in Section 6.10 of @woodGeneralizedAdditiveModels2017. -We start by fitting a semiparametric modeling with factor structures described in the vignette on [semiparametric latent variable modeling](https://lcbc-uio.github.io/galamm/articles/mixed_response.html). To make it more interesting we only keep the first 10 subjects. +We start by fitting a semiparametric modeling with factor structures described in the vignette on [semiparametric latent variable modeling](https://docs.ropensci.org/galamm/articles/mixed_response.html). To make it more interesting we only keep the first 10 subjects. ```{r} dat <- subset(cognition, domain == 1 & id <= 10) diff --git a/vignettes-raw/scaling.Rmd b/vignettes-raw/scaling.Rmd index 82fa6696..c02e77e0 100644 --- a/vignettes-raw/scaling.Rmd +++ b/vignettes-raw/scaling.Rmd @@ -36,7 +36,7 @@ n_replicates <- 20 ## Linear Mixed Models with Factor Structures -We start with the linear mixed model with factor structures described in [another vignette](https://lcbc-uio.github.io/galamm/articles/lmm_factor.html). Our goal here is to study how the computing time scales with the number of observations. +We start with the linear mixed model with factor structures described in [another vignette](https://docs.ropensci.org/galamm/articles/lmm_factor.html). Our goal here is to study how the computing time scales with the number of observations. ```{r} data(KYPSsim, package = "PLmixed") @@ -124,7 +124,7 @@ rm(all_sids, sim_params) ## Model with Group-Wise Heteroscedasticity -We now consider the model with group-wise heteroscedasticity consider in [the vignette on heteroscedastic linear mixed models](https://lcbc-uio.github.io/galamm/articles/lmm_heteroscedastic.html). +We now consider the model with group-wise heteroscedasticity consider in [the vignette on heteroscedastic linear mixed models](https://docs.ropensci.org/galamm/articles/lmm_heteroscedastic.html). There 1200 rows and 200 unique IDs in the dataset. We take subset of IDs, while keeping the remaining model structure unchanged. @@ -184,7 +184,7 @@ rm(all_ids, sim_params) ## Generalized Linear Mixed Models with Factor Structures -We now consider an example described in the [vignette on generalized linear mixed models with factor structures](https://lcbc-uio.github.io/galamm/articles/glmm_factor.html). +We now consider an example described in the [vignette on generalized linear mixed models with factor structures](https://docs.ropensci.org/galamm/articles/glmm_factor.html). ```{r} data(IRTsim, package = "PLmixed") @@ -255,7 +255,7 @@ rm(all_sids, sim_params) ## Semiparametric Model with Gaussian Responses -We can study the scaling issue further in semiparametric models with factor structures, which are described in [a separate vignette](https://lcbc-uio.github.io/galamm/articles/semiparametric.html). +We can study the scaling issue further in semiparametric models with factor structures, which are described in [a separate vignette](https://docs.ropensci.org/galamm/articles/semiparametric.html). The data for domain 1 has 4,800 rows and 200 unique IDs. diff --git a/vignettes-raw/semiparametric.Rmd b/vignettes-raw/semiparametric.Rmd index e888c6fb..a4743860 100644 --- a/vignettes-raw/semiparametric.Rmd +++ b/vignettes-raw/semiparametric.Rmd @@ -26,7 +26,7 @@ library(galamm) library(gamm4) ``` -This vignette describes how to use `galamm` to estimate latent variable models with smooth terms, or equivalently, generalized additive mixed models with factor structures. The examples are based on Section 4 and 5 in @sorensenLongitudinalModelingAgeDependent2023, but as we cannot share the data, we have instead simulated somewhat simpler datasets that will be used. We will gradually add complexity, starting with a simple generalized additive mixed model. Please refer to the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html) for an overview of the statistical models. +This vignette describes how to use `galamm` to estimate latent variable models with smooth terms, or equivalently, generalized additive mixed models with factor structures. The examples are based on Section 4 and 5 in @sorensenLongitudinalModelingAgeDependent2023, but as we cannot share the data, we have instead simulated somewhat simpler datasets that will be used. We will gradually add complexity, starting with a simple generalized additive mixed model. Please refer to the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html) for an overview of the statistical models. ## Generalized Additive Mixed Models @@ -58,7 +58,7 @@ for(i in unique(dat$id)) { points(dat$x, dat$y, pch = 20, lwd = .05) ``` -We use a generalized additive mixed model with random intercepts per subject to estimate the function relating $x$ to $y$. In terms of the model framework outlined in the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html), we model the $i$th response from the $j$th subject with +We use a generalized additive mixed model with random intercepts per subject to estimate the function relating $x$ to $y$. In terms of the model framework outlined in the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html), we model the $i$th response from the $j$th subject with $$ y_{ij} = f(x_{ij}) + \eta_{j} + \epsilon_{ij} diff --git a/vignettes/galamm.Rmd b/vignettes/galamm.Rmd index d95baa58..98bfff82 100644 --- a/vignettes/galamm.Rmd +++ b/vignettes/galamm.Rmd @@ -37,7 +37,7 @@ $$ f\left(y | \theta, \phi\right) = \exp \left( \frac{y\theta(\mu) - b\left(\theta(\mu)\right)}{\phi} + c\left(y, \phi\right) \right) $$ -here $\mu = g^{-1}(\nu)$ is the mean, $g^{-1}(\cdot)$ is the inverse of link function $g(\cdot)$, $\nu$ is a "nonlinear predictor", $\phi$ is a dispersion parameter, and $b(\cdot)$ and $c(\cdot)$ are known functions. In contrast to what is assumed, e.g., by [lme4](https://cran.r-project.org/package=lme4) [@batesFittingLinearMixedEffects2015], the functions $b(\cdot)$, $c(\cdot)$, and $g(\cdot)$ are allowed to vary between observations. That is, the observations can come from different members of the exponential family. The vignette on [models with mixed response types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html) describes this in detail. +here $\mu = g^{-1}(\nu)$ is the mean, $g^{-1}(\cdot)$ is the inverse of link function $g(\cdot)$, $\nu$ is a "nonlinear predictor", $\phi$ is a dispersion parameter, and $b(\cdot)$ and $c(\cdot)$ are known functions. In contrast to what is assumed, e.g., by [lme4](https://cran.r-project.org/package=lme4) [@batesFittingLinearMixedEffects2015], the functions $b(\cdot)$, $c(\cdot)$, and $g(\cdot)$ are allowed to vary between observations. That is, the observations can come from different members of the exponential family. The vignette on [models with mixed response types](https://docs.ropensci.org/galamm/articles/mixed_response.html) describes this in detail. Using canonical link functions, the response model simplifies to @@ -113,12 +113,12 @@ We obtain maximum marginal likelihood estimates by maximizing $L\left(\boldsymbo To see how galamm is used in practice, take a look at the vignettes describing models with different components. -- [Linear mixed models with factor structures](https://lcbc-uio.github.io/galamm/articles/lmm_factor.html). -- [Generalized linear mixed models with factor structures](https://lcbc-uio.github.io/galamm/articles/glmm_factor.html). -- [Linear mixed models with heteroscedastic residuals](https://lcbc-uio.github.io/galamm/articles/lmm_heteroscedastic.html). -- [Models with interactions between latent and observed covariates](https://lcbc-uio.github.io/galamm/articles/latent_observed_interaction.html). -- [Mixed models with mixed response types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html). -- [Generalized additive mixed models with factor structures](https://lcbc-uio.github.io/galamm/articles/semiparametric.html). +- [Linear mixed models with factor structures](https://docs.ropensci.org/galamm/articles/lmm_factor.html). +- [Generalized linear mixed models with factor structures](https://docs.ropensci.org/galamm/articles/glmm_factor.html). +- [Linear mixed models with heteroscedastic residuals](https://docs.ropensci.org/galamm/articles/lmm_heteroscedastic.html). +- [Models with interactions between latent and observed covariates](https://docs.ropensci.org/galamm/articles/latent_observed_interaction.html). +- [Mixed models with mixed response types](https://docs.ropensci.org/galamm/articles/mixed_response.html). +- [Generalized additive mixed models with factor structures](https://docs.ropensci.org/galamm/articles/semiparametric.html). # References diff --git a/vignettes/glmm_factor.Rmd b/vignettes/glmm_factor.Rmd index de179719..e67e19a9 100644 --- a/vignettes/glmm_factor.Rmd +++ b/vignettes/glmm_factor.Rmd @@ -40,7 +40,7 @@ head(IRTsim) #> 2.1 2 1 1 1 ``` -Each student is identified by a student id `sid`, and each school with a school id given by the `school` variable. For each student, five item measurements have been made. We assume that the student's performance depends both on the students ability as well as on the school the student attends. Having the outline of GALAMMs from the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html) in mind, we assume a binomial response model with a logit link, yielding for the $i$th measurement of the $j$th student in the $k$th school, +Each student is identified by a student id `sid`, and each school with a school id given by the `school` variable. For each student, five item measurements have been made. We assume that the student's performance depends both on the students ability as well as on the school the student attends. Having the outline of GALAMMs from the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html) in mind, we assume a binomial response model with a logit link, yielding for the $i$th measurement of the $j$th student in the $k$th school, $$ \text{P}(y_{ijk} = 1 | \mathbf{x}_{ijk}, \boldsymbol{\eta}_{jk}) = \frac{\exp(\nu_{ijk})}{1 + \exp(\nu_{ijk})} diff --git a/vignettes/latent_observed_interaction.Rmd b/vignettes/latent_observed_interaction.Rmd index e538b539..e26270e1 100644 --- a/vignettes/latent_observed_interaction.Rmd +++ b/vignettes/latent_observed_interaction.Rmd @@ -19,7 +19,7 @@ vignette: > library(galamm) ``` -This vignette describes how `galamm` can be used to model interactions between latent and observed variables. The models described here can be considered extensions of the covariate measurement error model described in the [vignette on mixed response types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html#covariate-measurement-error-model), by allowing the latent variables to interaction with observed variables. +This vignette describes how `galamm` can be used to model interactions between latent and observed variables. The models described here can be considered extensions of the covariate measurement error model described in the [vignette on mixed response types](https://docs.ropensci.org/galamm/articles/mixed_response.html#covariate-measurement-error-model), by allowing the latent variables to interaction with observed variables. ## Linear Mixed Model with Latent Covariates @@ -70,7 +70,7 @@ x \beta + \boldsymbol{\epsilon}. $$ -In this equation $\boldsymbol{\beta}_{0} \in \mathbb{R}^{3}$ is a vector of intercepts, $\eta$ is a latent variable, the loading of the latent variable onto the first measurement $y_{1}$ is fixed to 1 for identifiability, $\lambda_{2}$ is the loading of the latent variable onto the second measurement $y_{2}$, $\lambda_{3}$ is the main effect of the latent variable on the response of interest $y_{3}$, $\beta$ is the effect of the observed covariate $x$ on $y_{3}$, and $\lambda_{4}$ is the interaction effect of $x$ and $\eta$ on $y_{3}$. We assume that the residuals $\boldsymbol{\epsilon}$ are independently and identically normally distributed; this assumption is valid in this simulated case, but note that since the response $y_{3}$ is qualitatively different from the measurements $y_{1}$ and $y_{2}$, this assumption will in general not hold, and a [heteroscedastic measurement model](https://lcbc-uio.github.io/galamm/articles/lmm_heteroscedastic.html) should be used, or a [model with mixed response types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html). For a more detailed explanation of this way of formulating latent variable models in matrix form we refer to the first four pages of @rockwoodEstimatingComplexMeasurement2019. +In this equation $\boldsymbol{\beta}_{0} \in \mathbb{R}^{3}$ is a vector of intercepts, $\eta$ is a latent variable, the loading of the latent variable onto the first measurement $y_{1}$ is fixed to 1 for identifiability, $\lambda_{2}$ is the loading of the latent variable onto the second measurement $y_{2}$, $\lambda_{3}$ is the main effect of the latent variable on the response of interest $y_{3}$, $\beta$ is the effect of the observed covariate $x$ on $y_{3}$, and $\lambda_{4}$ is the interaction effect of $x$ and $\eta$ on $y_{3}$. We assume that the residuals $\boldsymbol{\epsilon}$ are independently and identically normally distributed; this assumption is valid in this simulated case, but note that since the response $y_{3}$ is qualitatively different from the measurements $y_{1}$ and $y_{2}$, this assumption will in general not hold, and a [heteroscedastic measurement model](https://docs.ropensci.org/galamm/articles/lmm_heteroscedastic.html) should be used, or a [model with mixed response types](https://docs.ropensci.org/galamm/articles/mixed_response.html). For a more detailed explanation of this way of formulating latent variable models in matrix form we refer to the first four pages of @rockwoodEstimatingComplexMeasurement2019. The structural model is simply $\eta = \zeta \sim N(0, \psi)$, where $\psi$ is its variance. diff --git a/vignettes/lmm_heteroscedastic.Rmd b/vignettes/lmm_heteroscedastic.Rmd index 5f5a1c37..27c00b0e 100644 --- a/vignettes/lmm_heteroscedastic.Rmd +++ b/vignettes/lmm_heteroscedastic.Rmd @@ -19,7 +19,7 @@ vignette: > library(galamm) ``` -At the moment, galamm supports group-wise heteroscedasticity in Gaussian response models. Referring to the model formulation outlined in the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html), the response model and nonlinear predictor can be easily combined in this particular case, to give +At the moment, galamm supports group-wise heteroscedasticity in Gaussian response models. Referring to the model formulation outlined in the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html), the response model and nonlinear predictor can be easily combined in this particular case, to give $$ y_{i} = \sum_{s=1}^{S} f_{s}\left(\mathbf{x}_{i}\right) + \sum_{l=2}^{L}\sum_{m=1}^{M_{l}} \eta_{m}^{(l)} \mathbf{z}^{(l)}_{im}{}^{'}\boldsymbol{\lambda}_{m}^{(l)} + \epsilon_{g(i)}, diff --git a/vignettes/mixed_response.Rmd b/vignettes/mixed_response.Rmd index 3d02ccce..cce9ebe0 100644 --- a/vignettes/mixed_response.Rmd +++ b/vignettes/mixed_response.Rmd @@ -38,7 +38,7 @@ head(mresp) #> 6 2 0.6924851 1.1750286 1.0000000 a ``` -In terms of the GALAMM defined in the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html), and for simplicity assuming we use canonical link functions, we have the response model +In terms of the GALAMM defined in the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html), and for simplicity assuming we use canonical link functions, we have the response model $$ f\left(y_{ij} | \nu_{ij}, \phi\right) = \exp \left( \frac{y_{ij}\nu_{ij} - b\left(\nu_{ij}\right)}{\phi} + c\left(y_{ij}, \phi\right) \right) @@ -139,7 +139,7 @@ summary(mixed_resp) ### Mixed Response and Heteroscedastic Residuals -Mixed response models can be combined with heteroscedastic residuals, which are described in the vignette on [linear mixed models with heteroscedastic residuals](https://lcbc-uio.github.io/galamm/articles/lmm_heteroscedastic.html). However, some care is needed in this case. We illustrate with the dataset `mresp_hsced`, whose first few lines are shown below: +Mixed response models can be combined with heteroscedastic residuals, which are described in the vignette on [linear mixed models with heteroscedastic residuals](https://docs.ropensci.org/galamm/articles/lmm_heteroscedastic.html). However, some care is needed in this case. We illustrate with the dataset `mresp_hsced`, whose first few lines are shown below: ``` r diff --git a/vignettes/optimization.Rmd b/vignettes/optimization.Rmd index 9304bbac..5494a96f 100644 --- a/vignettes/optimization.Rmd +++ b/vignettes/optimization.Rmd @@ -33,7 +33,7 @@ At convergence, the Hessian matrix of second derivatives is computed exactly, ag ## Modifying the L-BFGS-B algorithm -We will illustrate some ways of modifying the optimization procedure with the covariate measurement model example shown in the [vignette on models with mixed response types](https://lcbc-uio.github.io/galamm/articles/mixed_response.html). Here we start by simply setting up what we need to fit the model. +We will illustrate some ways of modifying the optimization procedure with the covariate measurement model example shown in the [vignette on models with mixed response types](https://docs.ropensci.org/galamm/articles/mixed_response.html). Here we start by simply setting up what we need to fit the model. ``` r diff --git a/vignettes/posterior_sampling.Rmd b/vignettes/posterior_sampling.Rmd index 9b2ee5f0..e049284f 100644 --- a/vignettes/posterior_sampling.Rmd +++ b/vignettes/posterior_sampling.Rmd @@ -21,7 +21,7 @@ library(galamm) Sampling from the empirical Bayes posterior distribution can be a convenient way of obtaining confidence bands for nonlinear functions of the estimated parameters. More background can be found in [this blog post by Gavin Simpson](https://fromthebottomoftheheap.net/2016/12/15/simultaneous-interval-revisited/) and in Section 6.10 of @woodGeneralizedAdditiveModels2017. -We start by fitting a semiparametric modeling with factor structures described in the vignette on [semiparametric latent variable modeling](https://lcbc-uio.github.io/galamm/articles/mixed_response.html). To make it more interesting we only keep the first 10 subjects. +We start by fitting a semiparametric modeling with factor structures described in the vignette on [semiparametric latent variable modeling](https://docs.ropensci.org/galamm/articles/mixed_response.html). To make it more interesting we only keep the first 10 subjects. ``` r diff --git a/vignettes/scaling.Rmd b/vignettes/scaling.Rmd index c4c3966c..c1a296ae 100644 --- a/vignettes/scaling.Rmd +++ b/vignettes/scaling.Rmd @@ -31,7 +31,7 @@ n_replicates <- 20 ## Linear Mixed Models with Factor Structures -We start with the linear mixed model with factor structures described in [another vignette](https://lcbc-uio.github.io/galamm/articles/lmm_factor.html). Our goal here is to study how the computing time scales with the number of observations. +We start with the linear mixed model with factor structures described in [another vignette](https://docs.ropensci.org/galamm/articles/lmm_factor.html). Our goal here is to study how the computing time scales with the number of observations. ``` r @@ -128,7 +128,7 @@ abline(fit) ## Model with Group-Wise Heteroscedasticity -We now consider the model with group-wise heteroscedasticity consider in [the vignette on heteroscedastic linear mixed models](https://lcbc-uio.github.io/galamm/articles/lmm_heteroscedastic.html). +We now consider the model with group-wise heteroscedasticity consider in [the vignette on heteroscedastic linear mixed models](https://docs.ropensci.org/galamm/articles/lmm_heteroscedastic.html). There 1200 rows and 200 unique IDs in the dataset. We take subset of IDs, while keeping the remaining model structure unchanged. @@ -194,7 +194,7 @@ abline(fit) ## Generalized Linear Mixed Models with Factor Structures -We now consider an example described in the [vignette on generalized linear mixed models with factor structures](https://lcbc-uio.github.io/galamm/articles/glmm_factor.html). +We now consider an example described in the [vignette on generalized linear mixed models with factor structures](https://docs.ropensci.org/galamm/articles/glmm_factor.html). ``` r @@ -272,7 +272,7 @@ We speculate that this is caused by the fact that for non-Gaussian models, a pen ## Semiparametric Model with Gaussian Responses -We can study the scaling issue further in semiparametric models with factor structures, which are described in [a separate vignette](https://lcbc-uio.github.io/galamm/articles/semiparametric.html). +We can study the scaling issue further in semiparametric models with factor structures, which are described in [a separate vignette](https://docs.ropensci.org/galamm/articles/semiparametric.html). The data for domain 1 has 4,800 rows and 200 unique IDs. diff --git a/vignettes/semiparametric.Rmd b/vignettes/semiparametric.Rmd index ef40b457..c0eb2acc 100644 --- a/vignettes/semiparametric.Rmd +++ b/vignettes/semiparametric.Rmd @@ -20,7 +20,7 @@ library(galamm) library(gamm4) ``` -This vignette describes how to use `galamm` to estimate latent variable models with smooth terms, or equivalently, generalized additive mixed models with factor structures. The examples are based on Section 4 and 5 in @sorensenLongitudinalModelingAgeDependent2023, but as we cannot share the data, we have instead simulated somewhat simpler datasets that will be used. We will gradually add complexity, starting with a simple generalized additive mixed model. Please refer to the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html) for an overview of the statistical models. +This vignette describes how to use `galamm` to estimate latent variable models with smooth terms, or equivalently, generalized additive mixed models with factor structures. The examples are based on Section 4 and 5 in @sorensenLongitudinalModelingAgeDependent2023, but as we cannot share the data, we have instead simulated somewhat simpler datasets that will be used. We will gradually add complexity, starting with a simple generalized additive mixed model. Please refer to the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html) for an overview of the statistical models. ## Generalized Additive Mixed Models @@ -64,7 +64,7 @@ points(dat$x, dat$y, pch = 20, lwd = .05) ![Plot of data for domain 1 and item 11.](semiparametric-spaghetti-plot-1.png) -We use a generalized additive mixed model with random intercepts per subject to estimate the function relating $x$ to $y$. In terms of the model framework outlined in the [introductory vignette](https://lcbc-uio.github.io/galamm/articles/galamm.html), we model the $i$th response from the $j$th subject with +We use a generalized additive mixed model with random intercepts per subject to estimate the function relating $x$ to $y$. In terms of the model framework outlined in the [introductory vignette](https://docs.ropensci.org/galamm/articles/galamm.html), we model the $i$th response from the $j$th subject with $$ y_{ij} = f(x_{ij}) + \eta_{j} + \epsilon_{ij} From 3b9b1429c8811626192bd757368cfbcc8dc0388a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98ystein=20S=C3=B8rensen?= Date: Mon, 3 Aug 2026 14:34:12 +0200 Subject: [PATCH 3/4] Rename news.md to NEWS.md and ship it with the package R and pkgdown expect the change log to be called NEWS.md. The file was previously excluded from the build, so the change log was not included in the installed package. It is now named and shipped as expected, and the entries for version 0.4.0 have been given their own heading. --- .Rbuildignore | 1 - news.md => NEWS.md | 2 +- codemeta.json | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) rename news.md => NEWS.md (99%) diff --git a/.Rbuildignore b/.Rbuildignore index 61b44076..37cfb740 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -12,7 +12,6 @@ ^docs$ ^pkgdown$ ^cran-comments\.md$ -^news\.md$ ^codemeta\.json$ rebuild-long-running-vignettes.R diff --git a/news.md b/NEWS.md similarity index 99% rename from news.md rename to NEWS.md index 78e45293..64b1a5fe 100644 --- a/news.md +++ b/NEWS.md @@ -19,7 +19,7 @@ model fitting functions. - The README describes how to install development versions from the rOpenSci R-universe. -# galamm 0.3.0 (development versions) +# galamm 0.4.0 - Vignettes are updated to better demonstrate model checking possibilities. - A qqmath() function has now been added, which makes quantile-quantile plots. diff --git a/codemeta.json b/codemeta.json index 5cb61881..c1dfa385 100644 --- a/codemeta.json +++ b/codemeta.json @@ -364,7 +364,7 @@ } } ], - "releaseNotes": "https://github.com/ropensci/galamm/blob/main/news.md", + "releaseNotes": "https://github.com/ropensci/galamm/blob/main/NEWS.md", "readme": "https://github.com/ropensci/galamm/blob/main/README.md", "contIntegration": ["https://github.com/ropensci/galamm/actions/workflows/R-CMD-check.yaml", "https://app.codecov.io/gh/ropensci/galamm?branch=main"], "developmentStatus": "https://www.repostatus.org/#active", From f9c894c256103fea171abffd0386a8e8d10d6f0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98ystein=20S=C3=B8rensen?= Date: Mon, 3 Aug 2026 14:40:07 +0200 Subject: [PATCH 4/4] Rebuild README.md from README.Rmd Regenerate the rendered README so that the code output matches the current sources. This also picks up citation and figure markup changes coming from newer versions of the rendering toolchain. --- README.md | 37 +++++++++++------------ man/figures/README-unnamed-chunk-9-1.png | Bin 25696 -> 25630 bytes 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 8984a893..3732355d 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,10 @@ coverage](https://codecov.io/gh/ropensci/galamm/branch/main/graph/badge.svg)](ht galamm estimates generalized additive latent and mixed models (GALAMMs). This is the first package implementing the model framework and the -computational algorithms introduced in Sørensen, Fjell, and Walhovd +computational algorithms introduced in Sørensen et al. ([2023](#ref-sorensenLongitudinalModelingAgeDependent2023)). It is an extension of the GLLAMM framework for multilevel latent variable -modeling detailed in Rabe-Hesketh, Skrondal, and Pickles +modeling detailed in Rabe-Hesketh et al. ([2004](#ref-rabe-heskethGeneralizedMultilevelStructural2004)) and Skrondal and Rabe-Hesketh ([2004](#ref-skrondalGeneralizedLatentVariable2004)), in particular by @@ -56,8 +56,7 @@ feasible with popular R packages like 2015](#ref-batesFittingLinearMixedEffects2015)), and [OpenMx](https://openmx.ssri.psu.edu/) ([Neale et al. 2016](#ref-nealeOpenMxExtendedStructural2016)), as well as the Stata -based [GLLAMM](http://www.gllamm.org/) software ([Rabe-Hesketh, -Skrondal, and Pickles +based [GLLAMM](http://www.gllamm.org/) software ([Rabe-Hesketh et al. 2004](#ref-rabe-heskethGeneralizedMultilevelStructural2004), [2005](#ref-rabe-heskethMaximumLikelihoodEstimation2005)). In particular, to maximally utilize large datasets available today, it is @@ -236,7 +235,7 @@ We finally plot the estimated smooth term. plot_smooth(mod) ``` - + ## How to cite this package @@ -284,8 +283,7 @@ for general guidelines. ## References -
+
@@ -307,18 +305,17 @@ Statistical Software* 67 (1): 1–48.
-Leal, Allan M. M. 2018. “Autodiff, a Modern, Fast and Expressive C++ -Library for Automatic Differentiation.” +Leal, Allan M. M. 2018. *Autodiff, a Modern, Fast and Expressive C++ +Library for Automatic Differentiation*.
-Neale, Michael C., Michael D. Hunter, Joshua N. Pritikin, Mahsa Zahery, -Timothy R. Brick, Robert M. Kirkpatrick, Ryne Estabrook, Timothy C. -Bates, Hermine H. Maes, and Steven M. Boker. 2016. “OpenMx 2.0: Extended -Structural Equation and Statistical Modeling.” *Psychometrika* 81 (2): -535–49. . +Neale, Michael C., Michael D. Hunter, Joshua N. Pritikin, et al. 2016. +“OpenMx 2.0: Extended Structural Equation and Statistical Modeling.” +*Psychometrika* 81 (2): 535–49. +.
@@ -334,10 +331,10 @@ Rabe-Hesketh, Sophia, Anders Skrondal, and Andrew Pickles. 2004.
-———. 2005. “Maximum Likelihood Estimation of Limited and Discrete -Dependent Variable Models with Nested Random Effects.” *Journal of -Econometrics* 128 (2): 301–23. -. +Rabe-Hesketh, Sophia, Anders Skrondal, and Andrew Pickles. 2005. +“Maximum Likelihood Estimation of Limited and Discrete Dependent +Variable Models with Nested Random Effects.” *Journal of Econometrics* +128 (2): 301–23. .
@@ -362,8 +359,8 @@ Modeling.” *Journal of Statistical Software* 48 (May): 1–36.
Skrondal, Anders, and Sophia Rabe-Hesketh. 2004. *Generalized Latent -Variable Modeling*. Interdisciplinary Statistics Series. Boca Raton, -Florida: Chapman and Hall/CRC. +Variable Modeling*. Interdisciplinary Statistics Series. Chapman and +Hall/CRC.
diff --git a/man/figures/README-unnamed-chunk-9-1.png b/man/figures/README-unnamed-chunk-9-1.png index ea4ae432cc4383b33134a4950b8849e53d0b27bf..a803954980179d9bdb8f0d397b98a3fd4c73eab4 100644 GIT binary patch literal 25630 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 NJEM12w@TX?_b)$A4nhC` literal 25696 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 P;r<3F<6}j-4$=Pw1SLM<