diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000..1def62c --- /dev/null +++ b/docs/404.html @@ -0,0 +1,96 @@ + + + + + + + +Page not found (404) • gsedscripts + + + + + + + + + + + +
+
+ + + + +
+
+ + +Content not found. Please use links in the navbar. + +
+ + + +
+ + + + +
+ + + + + + + + diff --git a/docs/authors.html b/docs/authors.html new file mode 100644 index 0000000..c38c439 --- /dev/null +++ b/docs/authors.html @@ -0,0 +1,91 @@ + +Authors and Citation • gsedscripts + + +
+
+ + + +
+
+
+ + + +
  • +

    Stef van Buuren. Maintainer. +

    +
  • +
+
+
+

Citation

+ +
+
+ + +

van Buuren S (2024). +gsedscripts: Package with scripts and functions for GSED validation. +R package version 0.18.0. +

+
@Manual{,
+  title = {gsedscripts: Package with scripts and functions for GSED validation},
+  author = {Stef {van Buuren}},
+  year = {2024},
+  note = {R package version 0.18.0},
+}
+ +
+ +
+ + + +
+ + + + + + + + diff --git a/docs/bootstrap-toc.css b/docs/bootstrap-toc.css new file mode 100644 index 0000000..5a85941 --- /dev/null +++ b/docs/bootstrap-toc.css @@ -0,0 +1,60 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ + +/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ + +/* All levels of nav */ +nav[data-toggle='toc'] .nav > li > a { + display: block; + padding: 4px 20px; + font-size: 13px; + font-weight: 500; + color: #767676; +} +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 19px; + color: #563d7c; + text-decoration: none; + background-color: transparent; + border-left: 1px solid #563d7c; +} +nav[data-toggle='toc'] .nav > .active > a, +nav[data-toggle='toc'] .nav > .active:hover > a, +nav[data-toggle='toc'] .nav > .active:focus > a { + padding-left: 18px; + font-weight: bold; + color: #563d7c; + background-color: transparent; + border-left: 2px solid #563d7c; +} + +/* Nav: second level (shown on .active) */ +nav[data-toggle='toc'] .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} +nav[data-toggle='toc'] .nav .nav > li > a { + padding-top: 1px; + padding-bottom: 1px; + padding-left: 30px; + font-size: 12px; + font-weight: normal; +} +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 29px; +} +nav[data-toggle='toc'] .nav .nav > .active > a, +nav[data-toggle='toc'] .nav .nav > .active:hover > a, +nav[data-toggle='toc'] .nav .nav > .active:focus > a { + padding-left: 28px; + font-weight: 500; +} + +/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */ +nav[data-toggle='toc'] .nav > .active > ul { + display: block; +} diff --git a/docs/bootstrap-toc.js b/docs/bootstrap-toc.js new file mode 100644 index 0000000..1cdd573 --- /dev/null +++ b/docs/bootstrap-toc.js @@ -0,0 +1,159 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ +(function() { + 'use strict'; + + window.Toc = { + helpers: { + // return all matching elements in the set, or their descendants + findOrFilter: function($el, selector) { + // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ + // http://stackoverflow.com/a/12731439/358804 + var $descendants = $el.find(selector); + return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); + }, + + generateUniqueIdBase: function(el) { + var text = $(el).text(); + var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); + return anchor || el.tagName.toLowerCase(); + }, + + generateUniqueId: function(el) { + var anchorBase = this.generateUniqueIdBase(el); + for (var i = 0; ; i++) { + var anchor = anchorBase; + if (i > 0) { + // add suffix + anchor += '-' + i; + } + // check if ID already exists + if (!document.getElementById(anchor)) { + return anchor; + } + } + }, + + generateAnchor: function(el) { + if (el.id) { + return el.id; + } else { + var anchor = this.generateUniqueId(el); + el.id = anchor; + return anchor; + } + }, + + createNavList: function() { + return $(''); + }, + + createChildNavList: function($parent) { + var $childList = this.createNavList(); + $parent.append($childList); + return $childList; + }, + + generateNavEl: function(anchor, text) { + var $a = $(''); + $a.attr('href', '#' + anchor); + $a.text(text); + var $li = $('
  • '); + $li.append($a); + return $li; + }, + + generateNavItem: function(headingEl) { + var anchor = this.generateAnchor(headingEl); + var $heading = $(headingEl); + var text = $heading.data('toc-text') || $heading.text(); + return this.generateNavEl(anchor, text); + }, + + // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). + getTopLevel: function($scope) { + for (var i = 1; i <= 6; i++) { + var $headings = this.findOrFilter($scope, 'h' + i); + if ($headings.length > 1) { + return i; + } + } + + return 1; + }, + + // returns the elements for the top level, and the next below it + getHeadings: function($scope, topLevel) { + var topSelector = 'h' + topLevel; + + var secondaryLevel = topLevel + 1; + var secondarySelector = 'h' + secondaryLevel; + + return this.findOrFilter($scope, topSelector + ',' + secondarySelector); + }, + + getNavLevel: function(el) { + return parseInt(el.tagName.charAt(1), 10); + }, + + populateNav: function($topContext, topLevel, $headings) { + var $context = $topContext; + var $prevNav; + + var helpers = this; + $headings.each(function(i, el) { + var $newNav = helpers.generateNavItem(el); + var navLevel = helpers.getNavLevel(el); + + // determine the proper $context + if (navLevel === topLevel) { + // use top level + $context = $topContext; + } else if ($prevNav && $context === $topContext) { + // create a new level of the tree and switch to it + $context = helpers.createChildNavList($prevNav); + } // else use the current $context + + $context.append($newNav); + + $prevNav = $newNav; + }); + }, + + parseOps: function(arg) { + var opts; + if (arg.jquery) { + opts = { + $nav: arg + }; + } else { + opts = arg; + } + opts.$scope = opts.$scope || $(document.body); + return opts; + } + }, + + // accepts a jQuery object, or an options object + init: function(opts) { + opts = this.helpers.parseOps(opts); + + // ensure that the data attribute is in place for styling + opts.$nav.attr('data-toggle', 'toc'); + + var $topContext = this.helpers.createChildNavList(opts.$nav); + var topLevel = this.helpers.getTopLevel(opts.$scope); + var $headings = this.helpers.getHeadings(opts.$scope, topLevel); + this.helpers.populateNav($topContext, topLevel, $headings); + } + }; + + $(function() { + $('nav[data-toggle="toc"]').each(function(i, el) { + var $nav = $(el); + Toc.init($nav); + }); + }); +})(); diff --git a/docs/docsearch.css b/docs/docsearch.css new file mode 100644 index 0000000..e5f1fe1 --- /dev/null +++ b/docs/docsearch.css @@ -0,0 +1,148 @@ +/* Docsearch -------------------------------------------------------------- */ +/* + Source: https://github.com/algolia/docsearch/ + License: MIT +*/ + +.algolia-autocomplete { + display: block; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 +} + +.algolia-autocomplete .ds-dropdown-menu { + width: 100%; + min-width: none; + max-width: none; + padding: .75rem 0; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .1); + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .175); +} + +@media (min-width:768px) { + .algolia-autocomplete .ds-dropdown-menu { + width: 175% + } +} + +.algolia-autocomplete .ds-dropdown-menu::before { + display: none +} + +.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-] { + padding: 0; + background-color: rgb(255,255,255); + border: 0; + max-height: 80vh; +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestions { + margin-top: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion { + padding: 0; + overflow: visible +} + +.algolia-autocomplete .algolia-docsearch-suggestion--category-header { + padding: .125rem 1rem; + margin-top: 0; + font-size: 1.3em; + font-weight: 500; + color: #00008B; + border-bottom: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--wrapper { + float: none; + padding-top: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column { + float: none; + width: auto; + padding: 0; + text-align: left +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content { + float: none; + width: auto; + padding: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content::before { + display: none +} + +.algolia-autocomplete .ds-suggestion:not(:first-child) .algolia-docsearch-suggestion--category-header { + padding-top: .75rem; + margin-top: .75rem; + border-top: 1px solid rgba(0, 0, 0, .1) +} + +.algolia-autocomplete .ds-suggestion .algolia-docsearch-suggestion--subcategory-column { + display: block; + padding: .1rem 1rem; + margin-bottom: 0.1; + font-size: 1.0em; + font-weight: 400 + /* display: none */ +} + +.algolia-autocomplete .algolia-docsearch-suggestion--title { + display: block; + padding: .25rem 1rem; + margin-bottom: 0; + font-size: 0.9em; + font-weight: 400 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--text { + padding: 0 1rem .5rem; + margin-top: -.25rem; + font-size: 0.8em; + font-weight: 400; + line-height: 1.25 +} + +.algolia-autocomplete .algolia-docsearch-footer { + width: 110px; + height: 20px; + z-index: 3; + margin-top: 10.66667px; + float: right; + font-size: 0; + line-height: 0; +} + +.algolia-autocomplete .algolia-docsearch-footer--logo { + background-image: url("data:image/svg+xml;utf8,"); + background-repeat: no-repeat; + background-position: 50%; + background-size: 100%; + overflow: hidden; + text-indent: -9000px; + width: 100%; + height: 100%; + display: block; + transform: translate(-8px); +} + +.algolia-autocomplete .algolia-docsearch-suggestion--highlight { + color: #FF8C00; + background: rgba(232, 189, 54, 0.1) +} + + +.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { + box-shadow: inset 0 -2px 0 0 rgba(105, 105, 105, .5) +} + +.algolia-autocomplete .ds-suggestion.ds-cursor .algolia-docsearch-suggestion--content { + background-color: rgba(192, 192, 192, .15) +} diff --git a/docs/docsearch.js b/docs/docsearch.js new file mode 100644 index 0000000..b35504c --- /dev/null +++ b/docs/docsearch.js @@ -0,0 +1,85 @@ +$(function() { + + // register a handler to move the focus to the search bar + // upon pressing shift + "/" (i.e. "?") + $(document).on('keydown', function(e) { + if (e.shiftKey && e.keyCode == 191) { + e.preventDefault(); + $("#search-input").focus(); + } + }); + + $(document).ready(function() { + // do keyword highlighting + /* modified from https://jsfiddle.net/julmot/bL6bb5oo/ */ + var mark = function() { + + var referrer = document.URL ; + var paramKey = "q" ; + + if (referrer.indexOf("?") !== -1) { + var qs = referrer.substr(referrer.indexOf('?') + 1); + var qs_noanchor = qs.split('#')[0]; + var qsa = qs_noanchor.split('&'); + var keyword = ""; + + for (var i = 0; i < qsa.length; i++) { + var currentParam = qsa[i].split('='); + + if (currentParam.length !== 2) { + continue; + } + + if (currentParam[0] == paramKey) { + keyword = decodeURIComponent(currentParam[1].replace(/\+/g, "%20")); + } + } + + if (keyword !== "") { + $(".contents").unmark({ + done: function() { + $(".contents").mark(keyword); + } + }); + } + } + }; + + mark(); + }); +}); + +/* Search term highlighting ------------------------------*/ + +function matchedWords(hit) { + var words = []; + + var hierarchy = hit._highlightResult.hierarchy; + // loop to fetch from lvl0, lvl1, etc. + for (var idx in hierarchy) { + words = words.concat(hierarchy[idx].matchedWords); + } + + var content = hit._highlightResult.content; + if (content) { + words = words.concat(content.matchedWords); + } + + // return unique words + var words_uniq = [...new Set(words)]; + return words_uniq; +} + +function updateHitURL(hit) { + + var words = matchedWords(hit); + var url = ""; + + if (hit.anchor) { + url = hit.url_without_anchor + '?q=' + escape(words.join(" ")) + '#' + hit.anchor; + } else { + url = hit.url + '?q=' + escape(words.join(" ")); + } + + return url; +} diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..e01a3c6 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,123 @@ + + + + + + + +Package with scripts and functions for GSED validation • gsedscripts + + + + + + + + + + + + +
    +
    + + + + +
    +
    +
    + + + +

    The gsedscripts repository contains script to read, process, model, summarise and plot data collected within the Global Scales of Early Development project of the World Health Organisation (WHO).

    +
    +

    Acknowledgement +

    +

    This study was supported by the Bill & Melinda Gates Foundation. The contents are the sole responsibility of the authors and may not necessarily represent the official views of the Bill & Melinda Gates Foundation or other agencies that may have supported the primary data studies used in the present study.

    +
    +
    +
    + + +
    + + +
    + +
    +

    +

    Site built with pkgdown 2.1.0.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/link.svg b/docs/link.svg new file mode 100644 index 0000000..88ad827 --- /dev/null +++ b/docs/link.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/docs/news/index.html b/docs/news/index.html new file mode 100644 index 0000000..0d8cd39 --- /dev/null +++ b/docs/news/index.html @@ -0,0 +1,175 @@ + +Changelog • gsedscripts + + +
    +
    + + + +
    +
    + + +
    + +
    • Updates scripts/models/293_0.R to use DIF tabulation function and explore Yen’s Q3 method for exploring dimensionality
    • +
    • Updates scripts/models/lf_155_0.R to feature newer functions and to compact code
    • +
    • Adds scripts/DIF_demo_2groups.R to shows how to use the difR package in the SMOCC data for testing 2-group DIF with MH and logistic regression methods
    • +
    • Adds calculate_DIF_table() for testing DIF
    • +
    +
    + +
    • Substantial update 293_0 script +
      • better stepwise approach
      • +
      • use of new functions to reduce copies
      • +
      • add item deletion of rare categories
      • +
      • add code to test D-score - logit alignment
      • +
      • check anchors
      • +
      • graph item and person fit
      • +
      • add tests for DIF by cohort
      • +
    • +
    • Generalizes make_wide() to provide more records for analysis
    • +
    +
    + +
    +
    + +
    • Adds function update_required_packages() to automate modelling scripts
    • +
    • Adds function calculate_administrative() for deriving standard administrative variables
    • +
    • Adds function make_wide() to combine SF, LF and BSID data from the first observation period onto one record per child
    • +
    • Adds a script inst/scripts/compare_domain_taus_293.R to inspect the overlap between three streams of the LF a as way to informally inspect the uni-dimensionality of the LF. Used for the July 2024 version of the phase1 paper.
    • +
    • Adds a scripts inst/scripts/extract_equate_table.R to extract the equate table to compare keys gsed1912 and gsed2406. Used for the July 2024 version of the phase1 paper.
    • +
    +
    + +
    • Adds Rmd/20240802_logit.Rmd to demonstrate that logit and D-score scales are consistent for LF and SF, but not for other instruments
    • +
    • Adds new procedure inst/script/models/by3_extension.R to link BSID-III under fixing SF/LF tau estimates to those in model 293_0, leading to consistent logit and D-score scale for BSID-III
    • +
    +
    + +
    • Perform updates of model 293_0 using additional LF data for BGD
    • +
    +
    + +
    • Replaces fit_phase1_healthy_reference.R by fit_preliminary_standards.R +
    • +
    +
    + +
    • Adds a new fuzzymatching method to inst/scripts/counts.R and inst/scripts/293_0.R that takes only the first LF, SF and BSID before matching. As a result, each row corresponds to a unique subjid (child). This does not use all data, but is much easier to explain and report. The impact of the method on the item difficulty estimates is negligible (r > 0.99).
    • +
    +
    + +
    • Adds script inst/scripts/fit_phase1_healthy_references.R to calculate new healthy references for the GSED key
    • +
    • Copies code for creating Dutch references for the GSED key into file inst/scripts/fit_phase1_dutch_references.R +
    • +
    +
    + +
    • Extends script inst/scripts/fit_models.R a refit using dscore 1.8.8 +
    • +
    • Adds script inst/scripts/compare_algorithm.R to compare models “20221201_remodel/293_0” and “20240601/293_0” using dscore 1.8.8 +
    • +
    • Adds script inst/scripts/compare_models.R to compare models “20221201_remodel/293_0” and “20240601/293_0” using the dscore 1.8.8 +
    • +
    • Extends script inst/scripts/fit_phase1_references.R with calculation of the healthy subsample references from the GSED key
    • +
    • Extends script inst/scripts/fit_phase1_references.R with calculation of the Dutch references from the GSED key
    • +
    +
    + +
    • Changes path in source scripts for GSED SF and BSID so that it will run from any directory, as long as the R packages dmetric and gsedscript are installed on the user’s machine.
    • +
    +
    + +
    • Adds source scripts for document that explain scoring GSED LF and GSED SF
    • +
    +
    + +
    • Make scripts better useable as external call
    • +
    +
    + +
    • Updates modeling scripts
    • +
    • Updates reports that documents actions taken to solve LF item order problem
    • +
    +
    + +
    • Adds document to log actions taken to solve the LF item order problem
    • +
    • Updates data reading scripts assemble_data.R and edit_data.R +
    • +
    +
    + +
    • Adds inst/scripts/counts.R to produces basic counts on LF, SF and BSID
    • +
    +
    + +
    • Adds key update and scoring Rmd’s for reporting
    • +
    • Adds scripts/export_gsed_sample.R which draws 10 sample cases
    • +
    • Moves .txt files to ../export
    • +
    • Moves .pdf files to ../plots
    • +
    +
    + +
    • Added a NEWS.md file to track changes to the package.
    • +
    +
    + + + +
    + + +
    + +
    +

    Site built with pkgdown 2.1.0.

    +
    + +
    + + + + + + + + diff --git a/docs/pkgdown.css b/docs/pkgdown.css new file mode 100644 index 0000000..80ea5b8 --- /dev/null +++ b/docs/pkgdown.css @@ -0,0 +1,384 @@ +/* Sticky footer */ + +/** + * Basic idea: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/ + * Details: https://github.com/philipwalton/solved-by-flexbox/blob/master/assets/css/components/site.css + * + * .Site -> body > .container + * .Site-content -> body > .container .row + * .footer -> footer + * + * Key idea seems to be to ensure that .container and __all its parents__ + * have height set to 100% + * + */ + +html, body { + height: 100%; +} + +body { + position: relative; +} + +body > .container { + display: flex; + height: 100%; + flex-direction: column; +} + +body > .container .row { + flex: 1 0 auto; +} + +footer { + margin-top: 45px; + padding: 35px 0 36px; + border-top: 1px solid #e5e5e5; + color: #666; + display: flex; + flex-shrink: 0; +} +footer p { + margin-bottom: 0; +} +footer div { + flex: 1; +} +footer .pkgdown { + text-align: right; +} +footer p { + margin-bottom: 0; +} + +img.icon { + float: right; +} + +/* Ensure in-page images don't run outside their container */ +.contents img { + max-width: 100%; + height: auto; +} + +/* Fix bug in bootstrap (only seen in firefox) */ +summary { + display: list-item; +} + +/* Typographic tweaking ---------------------------------*/ + +.contents .page-header { + margin-top: calc(-60px + 1em); +} + +dd { + margin-left: 3em; +} + +/* Section anchors ---------------------------------*/ + +a.anchor { + display: none; + margin-left: 5px; + width: 20px; + height: 20px; + + background-image: url(./link.svg); + background-repeat: no-repeat; + background-size: 20px 20px; + background-position: center center; +} + +h1:hover .anchor, +h2:hover .anchor, +h3:hover .anchor, +h4:hover .anchor, +h5:hover .anchor, +h6:hover .anchor { + display: inline-block; +} + +/* Fixes for fixed navbar --------------------------*/ + +.contents h1, .contents h2, .contents h3, .contents h4 { + padding-top: 60px; + margin-top: -40px; +} + +/* Navbar submenu --------------------------*/ + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu>.dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover>.dropdown-menu { + display: block; +} + +.dropdown-submenu>a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover>a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 10px; + border-radius: 6px 0 6px 6px; +} + +/* Sidebar --------------------------*/ + +#pkgdown-sidebar { + margin-top: 30px; + position: -webkit-sticky; + position: sticky; + top: 70px; +} + +#pkgdown-sidebar h2 { + font-size: 1.5em; + margin-top: 1em; +} + +#pkgdown-sidebar h2:first-child { + margin-top: 0; +} + +#pkgdown-sidebar .list-unstyled li { + margin-bottom: 0.5em; +} + +/* bootstrap-toc tweaks ------------------------------------------------------*/ + +/* All levels of nav */ + +nav[data-toggle='toc'] .nav > li > a { + padding: 4px 20px 4px 6px; + font-size: 1.5rem; + font-weight: 400; + color: inherit; +} + +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 5px; + color: inherit; + border-left: 1px solid #878787; +} + +nav[data-toggle='toc'] .nav > .active > a, +nav[data-toggle='toc'] .nav > .active:hover > a, +nav[data-toggle='toc'] .nav > .active:focus > a { + padding-left: 5px; + font-size: 1.5rem; + font-weight: 400; + color: inherit; + border-left: 2px solid #878787; +} + +/* Nav: second level (shown on .active) */ + +nav[data-toggle='toc'] .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} + +nav[data-toggle='toc'] .nav .nav > li > a { + padding-left: 16px; + font-size: 1.35rem; +} + +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 15px; +} + +nav[data-toggle='toc'] .nav .nav > .active > a, +nav[data-toggle='toc'] .nav .nav > .active:hover > a, +nav[data-toggle='toc'] .nav .nav > .active:focus > a { + padding-left: 15px; + font-weight: 500; + font-size: 1.35rem; +} + +/* orcid ------------------------------------------------------------------- */ + +.orcid { + font-size: 16px; + color: #A6CE39; + /* margins are required by official ORCID trademark and display guidelines */ + margin-left:4px; + margin-right:4px; + vertical-align: middle; +} + +/* Reference index & topics ----------------------------------------------- */ + +.ref-index th {font-weight: normal;} + +.ref-index td {vertical-align: top; min-width: 100px} +.ref-index .icon {width: 40px;} +.ref-index .alias {width: 40%;} +.ref-index-icons .alias {width: calc(40% - 40px);} +.ref-index .title {width: 60%;} + +.ref-arguments th {text-align: right; padding-right: 10px;} +.ref-arguments th, .ref-arguments td {vertical-align: top; min-width: 100px} +.ref-arguments .name {width: 20%;} +.ref-arguments .desc {width: 80%;} + +/* Nice scrolling for wide elements --------------------------------------- */ + +table { + display: block; + overflow: auto; +} + +/* Syntax highlighting ---------------------------------------------------- */ + +pre, code, pre code { + background-color: #f8f8f8; + color: #333; +} +pre, pre code { + white-space: pre-wrap; + word-break: break-all; + overflow-wrap: break-word; +} + +pre { + border: 1px solid #eee; +} + +pre .img, pre .r-plt { + margin: 5px 0; +} + +pre .img img, pre .r-plt img { + background-color: #fff; +} + +code a, pre a { + color: #375f84; +} + +a.sourceLine:hover { + text-decoration: none; +} + +.fl {color: #1514b5;} +.fu {color: #000000;} /* function */ +.ch,.st {color: #036a07;} /* string */ +.kw {color: #264D66;} /* keyword */ +.co {color: #888888;} /* comment */ + +.error {font-weight: bolder;} +.warning {font-weight: bolder;} + +/* Clipboard --------------------------*/ + +.hasCopyButton { + position: relative; +} + +.btn-copy-ex { + position: absolute; + right: 0; + top: 0; + visibility: hidden; +} + +.hasCopyButton:hover button.btn-copy-ex { + visibility: visible; +} + +/* headroom.js ------------------------ */ + +.headroom { + will-change: transform; + transition: transform 200ms linear; +} +.headroom--pinned { + transform: translateY(0%); +} +.headroom--unpinned { + transform: translateY(-100%); +} + +/* mark.js ----------------------------*/ + +mark { + background-color: rgba(255, 255, 51, 0.5); + border-bottom: 2px solid rgba(255, 153, 51, 0.3); + padding: 1px; +} + +/* vertical spacing after htmlwidgets */ +.html-widget { + margin-bottom: 10px; +} + +/* fontawesome ------------------------ */ + +.fab { + font-family: "Font Awesome 5 Brands" !important; +} + +/* don't display links in code chunks when printing */ +/* source: https://stackoverflow.com/a/10781533 */ +@media print { + code a:link:after, code a:visited:after { + content: ""; + } +} + +/* Section anchors --------------------------------- + Added in pandoc 2.11: https://github.com/jgm/pandoc-templates/commit/9904bf71 +*/ + +div.csl-bib-body { } +div.csl-entry { + clear: both; +} +.hanging-indent div.csl-entry { + margin-left:2em; + text-indent:-2em; +} +div.csl-left-margin { + min-width:2em; + float:left; +} +div.csl-right-inline { + margin-left:2em; + padding-left:1em; +} +div.csl-indent { + margin-left: 2em; +} diff --git a/docs/pkgdown.js b/docs/pkgdown.js new file mode 100644 index 0000000..6f0eee4 --- /dev/null +++ b/docs/pkgdown.js @@ -0,0 +1,108 @@ +/* http://gregfranko.com/blog/jquery-best-practices/ */ +(function($) { + $(function() { + + $('.navbar-fixed-top').headroom(); + + $('body').css('padding-top', $('.navbar').height() + 10); + $(window).resize(function(){ + $('body').css('padding-top', $('.navbar').height() + 10); + }); + + $('[data-toggle="tooltip"]').tooltip(); + + var cur_path = paths(location.pathname); + var links = $("#navbar ul li a"); + var max_length = -1; + var pos = -1; + for (var i = 0; i < links.length; i++) { + if (links[i].getAttribute("href") === "#") + continue; + // Ignore external links + if (links[i].host !== location.host) + continue; + + var nav_path = paths(links[i].pathname); + + var length = prefix_length(nav_path, cur_path); + if (length > max_length) { + max_length = length; + pos = i; + } + } + + // Add class to parent
  • , and enclosing
  • if in dropdown + if (pos >= 0) { + var menu_anchor = $(links[pos]); + menu_anchor.parent().addClass("active"); + menu_anchor.closest("li.dropdown").addClass("active"); + } + }); + + function paths(pathname) { + var pieces = pathname.split("/"); + pieces.shift(); // always starts with / + + var end = pieces[pieces.length - 1]; + if (end === "index.html" || end === "") + pieces.pop(); + return(pieces); + } + + // Returns -1 if not found + function prefix_length(needle, haystack) { + if (needle.length > haystack.length) + return(-1); + + // Special case for length-0 haystack, since for loop won't run + if (haystack.length === 0) { + return(needle.length === 0 ? 0 : -1); + } + + for (var i = 0; i < haystack.length; i++) { + if (needle[i] != haystack[i]) + return(i); + } + + return(haystack.length); + } + + /* Clipboard --------------------------*/ + + function changeTooltipMessage(element, msg) { + var tooltipOriginalTitle=element.getAttribute('data-original-title'); + element.setAttribute('data-original-title', msg); + $(element).tooltip('show'); + element.setAttribute('data-original-title', tooltipOriginalTitle); + } + + if(ClipboardJS.isSupported()) { + $(document).ready(function() { + var copyButton = ""; + + $("div.sourceCode").addClass("hasCopyButton"); + + // Insert copy buttons: + $(copyButton).prependTo(".hasCopyButton"); + + // Initialize tooltips: + $('.btn-copy-ex').tooltip({container: 'body'}); + + // Initialize clipboard: + var clipboardBtnCopies = new ClipboardJS('[data-clipboard-copy]', { + text: function(trigger) { + return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); + } + }); + + clipboardBtnCopies.on('success', function(e) { + changeTooltipMessage(e.trigger, 'Copied!'); + e.clearSelection(); + }); + + clipboardBtnCopies.on('error', function() { + changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); + }); + }); + } +})(window.jQuery || window.$) diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml new file mode 100644 index 0000000..38e10cb --- /dev/null +++ b/docs/pkgdown.yml @@ -0,0 +1,5 @@ +pandoc: 3.1.11 +pkgdown: 2.1.0 +pkgdown_sha: ~ +articles: {} +last_built: 2024-08-16T13:37Z diff --git a/docs/reference/Rplot001.png b/docs/reference/Rplot001.png new file mode 100644 index 0000000..17a3580 Binary files /dev/null and b/docs/reference/Rplot001.png differ diff --git a/docs/reference/calculate_DIF_table.html b/docs/reference/calculate_DIF_table.html new file mode 100644 index 0000000..f4ef760 --- /dev/null +++ b/docs/reference/calculate_DIF_table.html @@ -0,0 +1,155 @@ + +Calculate DIF statistic per item for multiple groups — calculate_DIF_table • gsedscripts + + +
    +
    + + + +
    +
    + + +
    +

    This function calculates DIF statistics for multiple groups using the +`difR` package. The function uses the `difGenLogistic()` function for +generalized logistic regression and the `difGMH()` function for the +generalized Mantel-Haenszel test. The function returns a table with +DIF statistics per item.

    +
    + +
    +
    calculate_DIF_table(data, items, score, group, levels = NULL, thr = NULL)
    +
    + +
    +

    Arguments

    + + +
    data
    +

    Data frame with dichotomous item responses and age

    + + +
    items
    +

    Character vector with item names

    + + +
    score
    +

    Data frame with item parameters

    + + +
    group
    +

    Factor or character vector with group names. Must have same +length as the number of rows in the data frame.

    + + +
    levels
    +

    Optional. Character vector with group names. If omitted, the function +will use the unique values of the group variable.

    + + +
    thr
    +

    Optional. Threshold for DIF classification using the MH-statistics. +If omitted, the function will use the threshold from the `difGMH()` function.

    + +
    +
    +

    Value

    +

    data frame with DIF statistics per item

    +
    +
    +

    Details

    +

    The function uses the `"holm"` method for p-value adjustment.

    +
    + +
    +

    Examples

    +
    library(dscore)
    +data <- dscore::milestones
    +score <- dscore(data = data, xname = "age", metric = "logit")[["d"]]
    +items <- intersect(get_itemnames(ins = "ddi", order = "indm"), colnames(data))
    +
    +calculate_DIF_table(data = data, items = items, group = data$sex, score = score)
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: algorithm did not converge
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: algorithm did not converge
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: algorithm did not converge
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: algorithm did not converge
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: algorithm did not converge
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: algorithm did not converge
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Warning: glm.fit: algorithm did not converge
    +#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
    +#> Error in n.ppk * diag(rk) - rk %*% t(rk): non-conformable arrays
    +
    +
    +
    + +
    + + +
    + +
    +

    Site built with pkgdown 2.1.0.

    +
    + +
    + + + + + + + + diff --git a/docs/reference/calculate_administrative.html b/docs/reference/calculate_administrative.html new file mode 100644 index 0000000..475126f --- /dev/null +++ b/docs/reference/calculate_administrative.html @@ -0,0 +1,89 @@ + +Calculate administrative variables — calculate_administrative • gsedscripts + + +
    +
    + + + +
    +
    + + +
    +

    Calculate administrative variables

    +
    + +
    +
    calculate_administrative(data)
    +
    + +
    +

    Arguments

    + + +
    data
    +

    Long form data, typically created by scripts/edit_data.R

    + +
    +
    +

    Value

    +

    Five administrtative variables

    +
    + +
    + +
    + + +
    + +
    +

    Site built with pkgdown 2.1.0.

    +
    + +
    + + + + + + + + diff --git a/docs/reference/index.html b/docs/reference/index.html new file mode 100644 index 0000000..74611cb --- /dev/null +++ b/docs/reference/index.html @@ -0,0 +1,91 @@ + +Package index • gsedscripts + + +
    +
    + + + +
    +
    + + + + + + + + + + + + + +
    +

    All functions

    +

    +
    +

    calculate_DIF_table()

    +

    Calculate DIF statistic per item for multiple groups

    +

    calculate_administrative()

    +

    Calculate administrative variables

    +

    make_wide()

    +

    Merge measurement made on different days to one child level record

    +

    require_package()

    +

    Require a package

    +

    update_required_packages()

    +

    Update the required packages to their development versions

    + + +
    + + +
    + +
    +

    Site built with pkgdown 2.1.0.

    +
    + +
    + + + + + + + + diff --git a/docs/reference/make_wide.html b/docs/reference/make_wide.html new file mode 100644 index 0000000..de8c2f1 --- /dev/null +++ b/docs/reference/make_wide.html @@ -0,0 +1,128 @@ + +Merge measurement made on different days to one child level record — make_wide • gsedscripts + + +
    +
    + + + +
    +
    + + +
    +

    For a given child, this script joins measurements made within a +specified window.

    +
    + +
    +
    make_wide(
    +  long,
    +  instruments = c("gpa", "gto", "by3"),
    +  days = 10L,
    +  drop_na_age = TRUE,
    +  include_return = FALSE,
    +  quiet = FALSE
    +)
    +
    + +
    +

    Arguments

    + + +
    long
    +

    Long form data, typically created by scripts/edit_data.R

    + + +
    instruments
    +

    Character vector of instruments names. Currently supported +instruments are `"gpa"`, `"gto"` and `"by3"`.

    + + +
    days
    +

    Non-negative integer, window width in number of days

    + + +
    drop_na_age
    +

    Logical. Should measurements with missing ages be dropped?

    + + +
    include_return
    +

    Logical. Should the return visits be included in the join?

    + + +
    quiet
    +

    Logical. Print messages to terminal?

    + +
    +
    +

    Value

    +

    A data frame with one record per child. The first five columns +are administrative variables, followed by the intervals in days per +instrument. The remaining columns are items from the instruments.

    +
    + +
    +

    Examples

    +
    if (FALSE) { # \dontrun{
    +joined <- make_wide(long, instruments = c("gpa", "gto"))
    +} # }
    +
    +
    +
    + +
    + + +
    + +
    +

    Site built with pkgdown 2.1.0.

    +
    + +
    + + + + + + + + diff --git a/docs/reference/require_package.html b/docs/reference/require_package.html new file mode 100644 index 0000000..b3a0d7c --- /dev/null +++ b/docs/reference/require_package.html @@ -0,0 +1,102 @@ + +Require a package — require_package • gsedscripts + + +
    +
    + + + +
    +
    + + +
    +

    Check whether a package is installed. If not, the +procedure offers to install the latest version from CRAN or GitHub. +Then it check for a minimum version.

    +
    + +
    +
    require_package(pkg, version, repo = "CRAN")
    +
    + +
    +

    Arguments

    + + +
    pkg
    +

    A string with the required package

    + + +
    version
    +

    A string with the minimum version, e.g. "0.1.0"

    + + +
    repo
    +

    A string with the GitHub repo name. For the default +`repo == "CRAN"` installation proceeds from CRAN.

    + +
    +
    +

    Value

    +

    A logical indicating success (TRUE) or failure (FALSE) for version check.

    +
    + +
    + +
    + + +
    + +
    +

    Site built with pkgdown 2.1.0.

    +
    + +
    + + + + + + + + diff --git a/docs/reference/update_required_packages.html b/docs/reference/update_required_packages.html new file mode 100644 index 0000000..31edc0f --- /dev/null +++ b/docs/reference/update_required_packages.html @@ -0,0 +1,99 @@ + +Update the required packages to their development versions — update_required_packages • gsedscripts + + +
    +
    + + + +
    +
    + + +
    +

    This function checks if the required packages are installed and up-to-date. +If not, it asks the user if they want to install the development versions +from GitHub.

    +
    + +
    +
    update_required_packages(allow_update = FALSE, include_gseddata = FALSE)
    +
    + +
    +

    Arguments

    + + +
    allow_update
    +

    Logical. If `TRUE`, the function will install the +development versions from GitHub. The default in `FALSE`

    + + +
    include_gseddata
    +

    Logical. If `TRUE`, the function will also check for +the `gseddata` package. The default is `FALSE`.

    + +
    +
    +

    Value

    +

    Logical. `TRUE` if all required packages are installed and up-to-date.

    +
    + +
    + +
    + + +
    + +
    +

    Site built with pkgdown 2.1.0.

    +
    + +
    + + + + + + + + diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 0000000..fc89872 --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,13 @@ + +/404.html +/authors.html +/index.html +/news/index.html +/reference/calculate_DIF_table.html +/reference/calculate_administrative.html +/reference/index.html +/reference/make_wide.html +/reference/require_package.html +/reference/update_required_packages.html + +