diff --git a/.nojekyll b/.nojekyll index f8dad36..c219112 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -4cf01359 \ No newline at end of file +afbefdf0 \ No newline at end of file diff --git a/evaluation/badges.html b/evaluation/badges.html index 31fc58e..236d9f6 100644 --- a/evaluation/badges.html +++ b/evaluation/badges.html @@ -263,10 +263,10 @@

Journal badges

This page evaluates the extent to which the author-published research artefacts meet the criteria of badges related to reproducibility from various organisations and journals.

-

Caveat: Please note that these criteria are based on available information about each badge online, and that we have likely differences in our procedure (e.g. allowed troubleshooting for execution and reproduction, not under tight time pressure to complete). Moreover, we focus only on reproduction of the discrete-event simulation, and not on other aspects of the article. We cannot guarantee that the badges below would have been awarded in practice by these journals.

+

Caveat: Please note that these criteria are based on available information about each badge online. Moreover, we focus only on reproduction of the discrete-event simulation, and not on other aspects of the article. We cannot guarantee that the badges below would have been awarded in practice by these journals.

Criteria

-
+
Code
from IPython.display import display, Markdown
@@ -275,138 +275,137 @@ 

Criteria

# Criteria and their definitions criteria = { - 'archive': 'Stored in a permanent archive that is publicly and openly accessible', - 'id': 'Has a persistent identifier', - 'license': 'Includes an open license', - 'relevant': '''Artefacts are relevant to and contribute to the article's results''', - 'complete': 'Complete set of materials shared (as would be needed to fully reproduce article)', - 'structure': 'Artefacts are well structured/organised (e.g. to the extent that reuse and repurposing is facilitated, adhering to norms and standards of research community)', - 'documentation_sufficient': 'Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)', - 'documentation_careful': 'Artefacts are carefully documented (more than sufficient - i.e. to the extent that reuse and repurposing is facilitated - e.g. changing parameters, reusing for own purpose)', - # This criteria is kept seperate to documentation_careful, as it specifically requires a README file - 'documentation_readme': 'Artefacts are clearly documented and accompanied by a README file with step-by-step instructions on how to reproduce results in the manuscript', - 'execute': 'Scripts can be successfully executed', - 'regenerated': 'Independent party regenerated results using the authors research artefacts', - 'hour': 'Reproduced within approximately one hour (excluding compute time)', -} - -# Evaluation for this study -eval = pd.Series({ - 'archive': 0, - 'id': 0, - 'license': 1, - 'relevant': 1, - 'complete': 0, - 'structure': 0, - 'documentation_sufficient': 0, - 'documentation_careful': 0, - 'documentation_readme': 0, - 'execute': 1, - 'regenerated': 0, - 'hour': 0, -}) - -# Get list of criteria met (True/False) overall -eval_list = list(eval) - -# Define function for creating the markdown formatted list of criteria met -def create_criteria_list(criteria_dict): - ''' - Creates a string which contains a Markdown formatted list with icons to - indicate whether each criteria was met - - Parameters: - ----------- - criteria_dict : dict - Dictionary where keys are the criteria (variable name) and values are - Boolean (True/False of whether this study met the criteria) - - Returns: - -------- - formatted_list : string - Markdown formatted list - ''' - callout_icon = {True: '✅', - False: '❌'} - # Create list with... - formatted_list = ''.join([ - '* ' + - callout_icon[eval[key]] + # Icon based on whether it met criteria - ' ' + - value + # Full text description of criteria - '\n' for key, value in criteria_dict.items()]) - return(formatted_list) - -# Define groups of criteria -criteria_share_how = ['archive', 'id', 'license'] -criteria_share_what = ['relevant', 'complete'] -criteria_doc_struc = ['structure', 'documentation_sufficient', 'documentation_careful', 'documentation_readme'] -criteria_run = ['execute', 'regenerated', 'hour'] - -# Create text section -display(Markdown(f''' -To assess whether the author's materials met the requirements of each badge, a list of criteria was produced. Between each badge (and between categories of badge), there is often alot of overlap in criteria. - -This study met **{sum(eval_list)} of the {len(eval_list)}** unique criteria items. These were as follows: - -Criteria related to how artefacts are shared - - -{create_criteria_list({k: criteria[k] for k in criteria_share_how})} - -Criteria related to what artefacts are shared - - -{create_criteria_list({k: criteria[k] for k in criteria_share_what})} - -Criteria related to the structure and documentation of the artefacts - - -{create_criteria_list({k: criteria[k] for k in criteria_doc_struc})} - -Criteria related to running and reproducing results - - -{create_criteria_list({k: criteria[k] for k in criteria_run})} -'''))
+ 'archive': 'Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)', + 'licence': 'Open licence', + 'complete': 'Complete (all relevant artefacts available)', + 'docs1': 'Documents (a) how code is used (b) how it relates to article (c) software, systems, packages and versions', + 'docs2': 'Documents (a) inventory of artefacts (b) sufficient description for artefacts to be exercised', + 'relevant': 'Artefacts relevant to paper', + 'execute': 'Scripts can be successfully executed', + 'careful': 'Artefacts are carefully documented and well-structured to the extent that reuse and repurposing is facilitated, adhering to norms and standards', + 'reproduce': 'Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)', + 'readme': 'README file with step-by-step instructions to run analysis', + 'dependencies': 'Dependencies (e.g. package versions) stated', + 'correspond': 'Clear how output of analysis corresponds to article' +} + +# Evaluation for this study +eval = pd.Series({ + 'archive': 0, + 'licence': 1, + 'complete': 0, + 'docs1': 0, + 'docs2': 0, + 'relevant': 1, + 'execute': 1, + 'careful': 0, + 'reproduce': 0, + 'readme': 0, + 'dependencies': 0, + 'correspond': 0 +}) + +# Get list of criteria met (True/False) overall +eval_list = list(eval) + +# Define function for creating the markdown formatted list of criteria met +def create_criteria_list(criteria_dict): + ''' + Creates a string which contains a Markdown formatted list with icons to + indicate whether each criteria was met + + Parameters: + ----------- + criteria_dict : dict + Dictionary where keys are the criteria (variable name) and values are + Boolean (True/False of whether this study met the criteria) + + Returns: + -------- + formatted_list : string + Markdown formatted list + ''' + callout_icon = {True: '✅', + False: '❌'} + # Create list with... + formatted_list = ''.join([ + '* ' + + callout_icon[eval[key]] + # Icon based on whether it met criteria + ' ' + + value + # Full text description of criteria + '\n' for key, value in criteria_dict.items()]) + return(formatted_list) + +# Define groups of criteria +criteria_share_how = ['archive', 'licence'] +criteria_share_what = ['complete', 'relevant'] +criteria_doc_struc = ['docs1', 'docs2', 'careful', 'readme', 'dependencies', 'correspond'] +criteria_run = ['execute', 'reproduce'] + +# Create text section +display(Markdown(f''' +To assess whether the author's materials met the requirements of each badge, a list of criteria was produced. Between each badge (and between categories of badge), there is often alot of overlap in criteria. + +This study met **{sum(eval_list)} of the {len(eval_list)}** unique criteria items. These were as follows: + +Criteria related to how artefacts are shared - + +{create_criteria_list({k: criteria[k] for k in criteria_share_how})} + +Criteria related to what artefacts are shared - + +{create_criteria_list({k: criteria[k] for k in criteria_share_what})} + +Criteria related to the structure and documentation of the artefacts - + +{create_criteria_list({k: criteria[k] for k in criteria_doc_struc})} + +Criteria related to running and reproducing results - + +{create_criteria_list({k: criteria[k] for k in criteria_run})} +'''))

To assess whether the author’s materials met the requirements of each badge, a list of criteria was produced. Between each badge (and between categories of badge), there is often alot of overlap in criteria.

This study met 3 of the 12 unique criteria items. These were as follows:

Criteria related to how artefacts are shared -

    -
  • ❌ Stored in a permanent archive that is publicly and openly accessible
  • -
  • ❌ Has a persistent identifier
  • -
  • ✅ Includes an open license
  • +
  • ❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)
  • +
  • ✅ Open licence

Criteria related to what artefacts are shared -

    -
  • ✅ Artefacts are relevant to and contribute to the article’s results
  • -
  • ❌ Complete set of materials shared (as would be needed to fully reproduce article)
  • +
  • ❌ Complete (all relevant artefacts available)
  • +
  • ✅ Artefacts relevant to paper

Criteria related to the structure and documentation of the artefacts -

    -
  • ❌ Artefacts are well structured/organised (e.g. to the extent that reuse and repurposing is facilitated, adhering to norms and standards of research community)
  • -
  • ❌ Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)
  • -
  • ❌ Artefacts are carefully documented (more than sufficient - i.e. to the extent that reuse and repurposing is facilitated - e.g. changing parameters, reusing for own purpose)
  • -
  • ❌ Artefacts are clearly documented and accompanied by a README file with step-by-step instructions on how to reproduce results in the manuscript
  • +
  • ❌ Documents (a) how code is used (b) how it relates to article (c) software, systems, packages and versions
  • +
  • ❌ Documents (a) inventory of artefacts (b) sufficient description for artefacts to be exercised
  • +
  • ❌ Artefacts are carefully documented and well-structured to the extent that reuse and repurposing is facilitated, adhering to norms and standards
  • +
  • ❌ README file with step-by-step instructions to run analysis
  • +
  • ❌ Dependencies (e.g. package versions) stated
  • +
  • ❌ Clear how output of analysis corresponds to article

Criteria related to running and reproducing results -

  • ✅ Scripts can be successfully executed
  • -
  • ❌ Independent party regenerated results using the authors research artefacts
  • -
  • ❌ Reproduced within approximately one hour (excluding compute time)
  • +
  • ❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)

Badges

-
+
Code
# Full badge names
 badge_names = {
     # Open objects
-    'open_niso': 'NISO "Open Research Objects (ORO)"',
-    'open_niso_all': 'NISO "Open Research Objects - All (ORO-A)"',
-    'open_acm': 'ACM "Artifacts Available"',
+    'open_acm': 'ACM "Artifacts Available"',
+    'open_niso': 'NISO "Open Research Objects (ORO)"',
+    'open_niso_all': 'NISO "Open Research Objects - All (ORO-A)"',
     'open_cos': 'COS "Open Code"',
     'open_ieee': 'IEEE "Code Available"',
     # Object review
@@ -414,8 +413,8 @@ 

Badges

'review_acm_reusable': 'ACM "Artifacts Evaluated - Reusable"', 'review_ieee': 'IEEE "Code Reviewed"', # Results reproduced - 'reproduce_niso': 'NISO "Results Reproduced (ROR-R)"', - 'reproduce_acm': 'ACM "Results Reproduced"', + 'reproduce_acm': 'ACM "Results Reproduced"', + 'reproduce_niso': 'NISO "Results Reproduced (ROR-R)"', 'reproduce_ieee': 'IEEE "Code Reproducible"', 'reproduce_psy': 'Psychological Science "Computational Reproducibility"' } @@ -423,20 +422,20 @@

Badges

# Criteria required by each badge badges = { # Open objects - 'open_niso': ['archive', 'id', 'license'], - 'open_niso_all': ['archive', 'id', 'license', 'complete'], - 'open_acm': ['archive', 'id'], - 'open_cos': ['archive', 'id', 'license', 'complete', 'documentation_sufficient'], + 'open_acm': ['archive'], + 'open_niso': ['archive', 'licence'], + 'open_niso_all': ['archive', 'licence', 'complete'], + 'open_cos': ['archive', 'licence', 'docs1'], 'open_ieee': ['complete'], # Object review - 'review_acm_functional': ['documentation_sufficient', 'relevant', 'complete', 'execute'], - 'review_acm_reusable': ['documentation_sufficient', 'documentation_careful', 'relevant', 'complete', 'execute', 'structure'], + 'review_acm_functional': ['docs2', 'relevant', 'complete', 'execute'], + 'review_acm_reusable': ['docs2', 'relevant', 'complete', 'execute', 'careful'], 'review_ieee': ['complete', 'execute'], # Results reproduced - 'reproduce_niso': ['regenerated'], - 'reproduce_acm': ['regenerated'], - 'reproduce_ieee': ['regenerated'], - 'reproduce_psy': ['regenerated', 'hour', 'structure', 'documentation_readme'], + 'reproduce_acm': ['reproduce'], + 'reproduce_niso': ['reproduce'], + 'reproduce_ieee': ['reproduce'], + 'reproduce_psy': ['reproduce', 'readme', 'dependencies', 'correspond'] } # Identify which badges would be awarded based on criteria @@ -541,7 +540,7 @@

“Open objects” bad

-❌ NISO “Open Research Objects (ORO)” +❌ ACM “Artifacts Available”
@@ -549,9 +548,7 @@

“Open objects” bad

Does not meet all criteria:

    -
  • ❌ Stored in a permanent archive that is publicly and openly accessible
  • -
  • ❌ Has a persistent identifier
  • -
  • ✅ Includes an open license
  • +
  • ❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)

@@ -564,7 +561,7 @@

“Open objects” bad
-❌ NISO “Open Research Objects - All (ORO-A)” +❌ NISO “Open Research Objects (ORO)”
@@ -572,10 +569,8 @@

“Open objects” bad

Does not meet all criteria:

    -
  • ❌ Stored in a permanent archive that is publicly and openly accessible
  • -
  • ❌ Has a persistent identifier
  • -
  • ✅ Includes an open license
  • -
  • ❌ Complete set of materials shared (as would be needed to fully reproduce article)
  • +
  • ❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)
  • +
  • ✅ Open licence
@@ -588,7 +583,7 @@

“Open objects” bad
-❌ ACM “Artifacts Available” +❌ NISO “Open Research Objects - All (ORO-A)”
@@ -596,8 +591,9 @@

“Open objects” bad

Does not meet all criteria:

    -
  • ❌ Stored in a permanent archive that is publicly and openly accessible
  • -
  • ❌ Has a persistent identifier
  • +
  • ❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)
  • +
  • ✅ Open licence
  • +
  • ❌ Complete (all relevant artefacts available)
@@ -618,11 +614,9 @@

“Open objects” bad

Does not meet all criteria:

    -
  • ❌ Stored in a permanent archive that is publicly and openly accessible
  • -
  • ❌ Has a persistent identifier
  • -
  • ✅ Includes an open license
  • -
  • ❌ Complete set of materials shared (as would be needed to fully reproduce article)
  • -
  • ❌ Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)
  • +
  • ❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)
  • +
  • ✅ Open licence
  • +
  • ❌ Documents (a) how code is used (b) how it relates to article (c) software, systems, packages and versions
@@ -643,7 +637,7 @@

“Open objects” bad

Does not meet all criteria:

    -
  • ❌ Complete set of materials shared (as would be needed to fully reproduce article)
  • +
  • ❌ Complete (all relevant artefacts available)
@@ -668,9 +662,9 @@

“Object review” b

Does not meet all criteria:

    -
  • ❌ Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)
  • -
  • ✅ Artefacts are relevant to and contribute to the article’s results
  • -
  • ❌ Complete set of materials shared (as would be needed to fully reproduce article)
  • +
  • ❌ Documents (a) inventory of artefacts (b) sufficient description for artefacts to be exercised
  • +
  • ✅ Artefacts relevant to paper
  • +
  • ❌ Complete (all relevant artefacts available)
  • ✅ Scripts can be successfully executed
@@ -692,12 +686,11 @@

“Object review” b

Does not meet all criteria:

    -
  • ❌ Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)
  • -
  • ❌ Artefacts are carefully documented (more than sufficient - i.e. to the extent that reuse and repurposing is facilitated - e.g. changing parameters, reusing for own purpose)
  • -
  • ✅ Artefacts are relevant to and contribute to the article’s results
  • -
  • ❌ Complete set of materials shared (as would be needed to fully reproduce article)
  • +
  • ❌ Documents (a) inventory of artefacts (b) sufficient description for artefacts to be exercised
  • +
  • ✅ Artefacts relevant to paper
  • +
  • ❌ Complete (all relevant artefacts available)
  • ✅ Scripts can be successfully executed
  • -
  • ❌ Artefacts are well structured/organised (e.g. to the extent that reuse and repurposing is facilitated, adhering to norms and standards of research community)
  • +
  • ❌ Artefacts are carefully documented and well-structured to the extent that reuse and repurposing is facilitated, adhering to norms and standards
@@ -718,7 +711,7 @@

“Object review” b

Does not meet all criteria:

    -
  • ❌ Complete set of materials shared (as would be needed to fully reproduce article)
  • +
  • ❌ Complete (all relevant artefacts available)
  • ✅ Scripts can be successfully executed
@@ -736,7 +729,7 @@

“Reproduced” badges<
-❌ NISO “Results Reproduced (ROR-R)” +❌ ACM “Results Reproduced”
@@ -744,7 +737,7 @@

“Reproduced” badges<

Does not meet all criteria:

    -
  • ❌ Independent party regenerated results using the authors research artefacts
  • +
  • ❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)
@@ -757,7 +750,7 @@

“Reproduced” badges<
-❌ ACM “Results Reproduced” +❌ NISO “Results Reproduced (ROR-R)”
@@ -765,7 +758,7 @@

“Reproduced” badges<

Does not meet all criteria:

    -
  • ❌ Independent party regenerated results using the authors research artefacts
  • +
  • ❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)
@@ -786,7 +779,7 @@

“Reproduced” badges<

Does not meet all criteria:

    -
  • ❌ Independent party regenerated results using the authors research artefacts
  • +
  • ❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)
@@ -807,10 +800,10 @@

“Reproduced” badges<

Does not meet all criteria:

    -
  • ❌ Independent party regenerated results using the authors research artefacts
  • -
  • ❌ Reproduced within approximately one hour (excluding compute time)
  • -
  • ❌ Artefacts are well structured/organised (e.g. to the extent that reuse and repurposing is facilitated, adhering to norms and standards of research community)
  • -
  • ❌ Artefacts are clearly documented and accompanied by a README file with step-by-step instructions on how to reproduce results in the manuscript
  • +
  • ❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)
  • +
  • ❌ README file with step-by-step instructions to run analysis
  • +
  • ❌ Dependencies (e.g. package versions) stated
  • +
  • ❌ Clear how output of analysis corresponds to article
@@ -837,13 +830,13 @@

Sources

-

Institute of Electrical and Electronics Engineers (IEEE) (Institute of Electrical and Electronics Engineers (IEEE) (n.d.))

+

Institute of Electrical and Electronics Engineers (IEEE) (Institute of Electrical and Electronics Engineers (IEEE) (2024))

-

Psychological Science (Hardwicke and Vazire (2023) and Association for Psychological Science (APS) (2023))

+

Psychological Science (Hardwicke and Vazire (2024) and Association for Psychological Science (APS) (2024))

@@ -856,17 +849,17 @@

Sources

Association for Computing Machinery (ACM). 2020. “Artifact Review and Badging Version 1.1.” ACM. https://www.acm.org/publications/policies/artifact-review-and-badging-current.
-
-Association for Psychological Science (APS). 2023. “Psychological Science Submission Guidelines.” APS. https://www.psychologicalscience.org/publications/psychological_science/ps-submissions. +
+Association for Psychological Science (APS). 2024. “Psychological Science Submission Guidelines.” APS. https://www.psychologicalscience.org/publications/psychological_science/ps-submissions.
Blohowiak, Ben B., Johanna Cohoon, Lee de-Wit, Eric Eich, Frank J. Farach, Fred Hasselman, Alex O. Holcombe, Macartan Humphreys, Melissa Lewis, and Brian A. Nosek. 2023. “Badges to Acknowledge Open Practices.” https://osf.io/tvyxz/.
-
-Hardwicke, Tom E., and Simine Vazire. 2023. “Transparency Is Now the Default at Psychological Science.” Psychological Science 0 (0). https://doi.org/https://doi.org/10.1177/09567976231221573. +
+Hardwicke, Tom E., and Simine Vazire. 2024. “Transparency Is Now the Default at Psychological Science.” Psychological Science 35 (7): 708–11. https://doi.org/10.1177/09567976231221573.
-
-Institute of Electrical and Electronics Engineers (IEEE). n.d. “About Content in IEEE Xplore.” IEEE Explore. Accessed May 20, 2024. https://ieeexplore.ieee.org/Xplorehelp/overview-of-ieee-xplore/about-content. +
+Institute of Electrical and Electronics Engineers (IEEE). 2024. “About Content in IEEE Xplore.” IEEE Explore. https://ieeexplore.ieee.org/Xplorehelp/overview-of-ieee-xplore/about-content.
NISO Reproducibility Badging and Definitions Working Group. 2021. “Reproducibility Badging and Definitions.” https://doi.org/10.3789/niso-rp-31-2021. diff --git a/evaluation/reporting.html b/evaluation/reporting.html index 8085999..b373f97 100644 --- a/evaluation/reporting.html +++ b/evaluation/reporting.html @@ -240,8 +240,8 @@

STRESS-DES

Of the 24 items in the checklist:

  • 14 were met fully (✅)
  • -
  • 6 were partially met (🟡)
  • -
  • 3 were not met (❌)
  • +
  • 5 were partially met (🟡)
  • +
  • 4 were not met (❌)
  • 1 was not applicable (N/A)
@@ -413,8 +413,8 @@

STRESS-DES

- - + + @@ -1064,7 +1064,7 @@

DES c - + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

Day 18

+
+
evaluation
+
+
+
+ + +
+ +
+
Author
+
+

Amy Heather

+
+
+ +
+
Published
+
+

November 4, 2024

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

Untimed: Amendment to evaluation

+

I noticed a mistake in my evaluation of the repository against STRESS-DES.

+

Criteria: 5.2 Random sampling

+

Original decision: 🟡 Partially met - no seeds but describes sampling of arrivals

+

New decision: ❌ Not met - as sampling of arrivals wasn’t relevant to this criteria (I had misunderstood)

+

I amended reporting.qmd, reproduction_report.qmd and stars_wp1_summary accordingly.

+ + +
+ +
+ +
+ + + + + + \ No newline at end of file diff --git a/logbook/posts/2024_11_21/index.html b/logbook/posts/2024_11_21/index.html new file mode 100644 index 0000000..7ea6774 --- /dev/null +++ b/logbook/posts/2024_11_21/index.html @@ -0,0 +1,704 @@ + + + + + + + + + + + +Reproducing Huang et al. 2019 - Day 19 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

Day 19

+
+
evaluation
+
+
+
+ + +
+ +
+
Author
+
+

Amy Heather

+
+
+ +
+
Published
+
+

October 21, 2024

+
+
+ + +
+ + +
+ + + + +
+ + + + + +
+
+
+ +
+
+Note +
+
+
+

Redid badge evaluation.

+
+
+
+

09.53-09.57: Revisit evaluation

+

Revisited and revised the badge criteria to (a) make them up-to-date, and (b) make sure they are specific to the descriptions from each badge. Hence, redoing evaluations for all eight studies.

+

Notes:

+
    +
  • Relevant - yes, as its the model needed, even if it is within an app
  • +
  • Executes - yes, although required significant troubleshooting, as I had to extract it from app code
  • +
+

Ran this by Tom who agreed. Results remain the same (3 criteria, 0 badge).

+ + +
+ +
+ +
+ + + + + + \ No newline at end of file diff --git a/search.json b/search.json index 2f2db98..31c7a8b 100644 --- a/search.json +++ b/search.json @@ -77,109 +77,151 @@ "text": "Untimed: Research compendium\nSome further work on the research compendium stage.\n\nAdd testthat to environment\nWrote basic test but to run it, RStudio had prompt that it required update of devtools. Selected “yes” and then saved another renv::snapshot() once it completed. However, I cancelled it as realised could run without devtools (and devtools would be alot of extra dependencies!)\nRan test with testthat::test_dir(\"tests\")\n\nLinks:\n\nAnother good resource for tests in R: https://raps-with-r.dev/testing.html\nA good resource for Docker and R: https://raps-with-r.dev/repro_cont.html\nTom’s R dockerfile: https://github.com/TomMonks/reproducible_r_docker/blob/main/Dockerfile" }, { - "objectID": "logbook/posts/2024_10_02/index.html", - "href": "logbook/posts/2024_10_02/index.html", - "title": "Day 17", + "objectID": "logbook/posts/2024_07_12/index.html", + "href": "logbook/posts/2024_07_12/index.html", + "title": "Day 8", "section": "", - "text": "Realised I had yet to archive repository, now that reproduction is complete. Update CITATION.cff and CHANGELOG.md then made a GitHub release." + "text": "Note\n\n\n\nSupplementary figure then evaluation against guidelines. Reproduction: 24h 10m (60.4%). Evaluation: 1h 31m." }, { - "objectID": "logbook/posts/2024_10_02/index.html#untimed-archive-repository", - "href": "logbook/posts/2024_10_02/index.html#untimed-archive-repository", - "title": "Day 17", - "section": "", - "text": "Realised I had yet to archive repository, now that reproduction is complete. Update CITATION.cff and CHANGELOG.md then made a GitHub release." + "objectID": "logbook/posts/2024_07_12/index.html#working-on-the-supplementary-figure", + "href": "logbook/posts/2024_07_12/index.html#working-on-the-supplementary-figure", + "title": "Day 8", + "section": "09.00-09.07, 09.14-09.24, 09.36-09.40: Working on the supplementary figure", + "text": "09.00-09.07, 09.14-09.24, 09.36-09.40: Working on the supplementary figure\nThe supplementary figure consists of doubling and tripling the number of ECR patients.\n\n“Since acquiring data for this study, the demands for ECR at our Comprehensive Stroke Service has doubled between 2018 and 19 and is predicted to triple by the end of 2019. We simulated these increased demands on the resource. As expected, the patient wait times do become longer, but the patterns of resource utilization remained unchanged, suggesting that the same bottlenecks affect throughput” Huang et al. (2019)\n\nI’ve assumed this to mean we double and triple the number of ED arrivals (ed_pt, e.g.ed_pt=107700*2), but the output plots looked vastly different to the paper!\n\n\n\nWrong supplementary figure\n\n\nI then realised I was mistaken, and that perhaps I should have interpreted this as being double and triple the ecr_pt (which is used when model decides whether patient needs ECR: PROB_ECR = ecr_pt / ais_pt). This looked right, and very similar to the paper, with the exception that my angioINR wait times curves peak much lower." }, { - "objectID": "logbook/posts/2024_07_05/index.html", - "href": "logbook/posts/2024_07_05/index.html", - "title": "Day 3", - "section": "", - "text": "Note\n\n\n\nSet-up environment and run model. Total time used: 7h 23m (18.5%)" + "objectID": "logbook/posts/2024_07_12/index.html#untimed-consensus-on-reproduction-success", + "href": "logbook/posts/2024_07_12/index.html#untimed-consensus-on-reproduction-success", + "title": "Day 8", + "section": "Untimed: Consensus on reproduction success", + "text": "Untimed: Consensus on reproduction success\nShared with Tom and Alison. Tom and Alison both agreed with decisions (reproduced Figure 5 and in-text 1 and 2, and not other items)." }, { - "objectID": "logbook/posts/2024_07_05/index.html#set-python-interpreter", - "href": "logbook/posts/2024_07_05/index.html#set-python-interpreter", - "title": "Day 3", - "section": "09.46-09.47: Set Python interpreter", - "text": "09.46-09.47: Set Python interpreter\nSet Python interpreter (e.g. to render these from RStudio) by clicking on the project in the top right of RStudio, then selecting Project Options > Python, and selecting the quarto_huang_2019 virtual environment I’d set up." + "objectID": "logbook/posts/2024_07_12/index.html#tidy-and-email-author", + "href": "logbook/posts/2024_07_12/index.html#tidy-and-email-author", + "title": "Day 8", + "section": "10.30-10.50: Tidy and email author", + "text": "10.30-10.50: Tidy and email author\nDid a little bit of tidying (e.g. removed some old scenarioes from reproduction.qmd), and then emailed the corresponding author, to let them know the progress with this work, and to ask for any advice re: discrepancies, and whether they might have and be happy to share code that produces these figures." }, { - "objectID": "logbook/posts/2024_07_05/index.html#returning-to-troubleshooting-r-version", - "href": "logbook/posts/2024_07_05/index.html#returning-to-troubleshooting-r-version", - "title": "Day 3", - "section": "09.48-10.21: Returning to troubleshooting R version", - "text": "09.48-10.21: Returning to troubleshooting R version\nContinuing to look at the instructions for old R releases from yesterday:\n\n“As of July 2023, packages for R versions below 4.0 are no longer being updated. R 3.6 packages for Ubuntu on i386 and amd64 are available for most stable Desktop releases of Ubuntu until their official end of life date. However, only the latest Long Term Support (LTS) release is fully supported. As of November 18, 2018 the supported releases are Bionic Beaver (18.04;LTS), Xenial Xerus (16.04; LTS), and Trusty Tahr (14.04; LTS).”\n\nBy running lsb_release -a, I can see that my linux version is jammy (22.04.4 LTS). Looking at the instructions from this Stackoverflow post, I’m a bit unclear as to whether I can use any of these if they’re for older versions of linux.\nFrom this help post, I then stumbled across RStudio r-builds which has R builds that say they should install fast on Ubuntu from a .deb file and are designed to easily switch between multiple versions of R. These say they support Ubunutu 22.04. I ran:\nR_VERSION=3.6.0\ncurl -O https://cdn.posit.co/r/ubuntu-2204/pkgs/r-${R_VERSION}_1_amd64.deb\nsudo apt-get install gdebi-core\nsudo gdebi r-${R_VERSION}_1_amd64.deb\nI confirmed this was installed by running /opt/R/${R_VERSION}/bin/R --version.\nI then followed their instructions to add R to the system path:\nsudo ln -s /opt/R/${R_VERSION}/bin/R /usr/local/bin/R \nsudo ln -s /opt/R/${R_VERSION}/bin/Rscript /usr/local/bin/Rscript\nI restarted RStudio and found I was now in R 3.6.0. I delete the renv (which was built with 4.4.1) and remade it.\nrenv::deactivate(clean=TRUE)\ninstall.packages(\"renv\")\nrenv::init(bare=TRUE)\nrenv::snapshot()\nThe lock file now had R 3.6.0 (previously 4.4.1) and renv 1.0.7." + "objectID": "logbook/posts/2024_07_12/index.html#timings-for-reproduction", + "href": "logbook/posts/2024_07_12/index.html#timings-for-reproduction", + "title": "Day 8", + "section": "Timings for reproduction", + "text": "Timings for reproduction\n\nimport sys\nsys.path.append('../')\nfrom timings import calculate_times\n\n# Minutes used prior to today\nused_to_date = 1409\n\n# Times from today\ntimes = [\n ('09.00', '09.07'),\n ('09.14', '09.24'),\n ('09.36', '09.40'),\n ('10.30', '10.50')]\n\ncalculate_times(used_to_date, times)\n\nTime spent today: 41m, or 0h 41m\nTotal used to date: 1450m, or 24h 10m\nTime remaining: 950m, or 15h 50m\nUsed 60.4% of 40 hours max" }, { - "objectID": "logbook/posts/2024_07_05/index.html#installing-the-packages", - "href": "logbook/posts/2024_07_05/index.html#installing-the-packages", - "title": "Day 3", - "section": "10.40-11.30, 11.35-11.41: Installing the packages", - "text": "10.40-11.30, 11.35-11.41: Installing the packages\nI ran renv::install() but it failed with: Warning: failed to find source for 'simmer.plot 0.1.15' in package repositories. Error: failed to retrieve package 'simmer.plot@0.1.15'.\nI then tried with remotes:\ninstall.packages(\"remotes\")\nremotes::install_version(\"simmer\", \"4.2.2\")\nHowever, this failed like before. Instead, I decided a different tactic - to just download them without the specified versions. I removed the versions from DESCRIPTION and ran renv::install(). However, this stopped with an error: Error: package 'evaluate' is not available.\nI then tried working through each package one by one.\nrenv::install(\"simmer\") was successful.\nrenv::install(\"simmer.plot\") failed with the issue of ‘evaluate’ is not available. Based on this StackOverflow post, I tried installing ‘stringi’ - but that didn’t end up helping. I tried install evaluate before and after restarting the R session but still stated as not available.\nUncertain on what else might fix this, I decided to actually just start again from the latest version of R and try installing the packages there and see if I could get it to work without backdating the packages. I closed RStudio and ran the commands as above but changed R_VERSION to 4.4.1. I also couldn’t run the commands for symbolic link as it said the files already exist. I restarted R but still 3.6.0. Looking in /opt/R/, I can see I now have 3.6.0 and 4.4.1.\nBased on the prior tutorial I’d found, I tried:\nexport RSTUDIO_WHICH_R=/opt/R/4.4.1/bin/R\nrstudio\nThis worked, although default when open from application bar was still set to 3.6.0. I tried changing the .profile file (nano .profile) to add export RSTUDIO_WHICH_R=/opt/R/4.4.1/bin/R but made no difference.\nI tried forcing replacement of the symbolic links then reopening RStudio:\nR_VERSION=4.4.1\nsudo ln -snf /opt/R/${R_VERSION}/bin/R /usr/local/bin/R \nsudo ln -snf /opt/R/${R_VERSION}/bin/Rscript /usr/local/bin/Rscript\nThis worked! So, trying again (with DESCRIPTION file still containing no versions)…\nrenv::deactivate(clean=TRUE)\ninstall.packages(\"renv\")\nrenv::init(bare=TRUE)\nrenv::snapshot()\nrenv::install()\nrenv::snapshot()" + "objectID": "logbook/posts/2024_07_12/index.html#badges", + "href": "logbook/posts/2024_07_12/index.html#badges", + "title": "Day 8", + "section": "10.58-11.06: Badges", + "text": "10.58-11.06: Badges\nAs mentioned in prior logbook entry, will now move on to evaluation stage.\nNotes on the unmet (and why)\n\narchive and id - only on GitHub\ncomplete - didn’t have the scenario and figure code\nstructure - not sufficient to facilitate reuse (i.e. would want more commenting/docstrings/dcoumentation), and as structure was designed for application (but had to extract code to make the paper results)\ndocumentation_… - no documentation provided\nregenerated - wasn’t able to reproduce all the items\nhour - took longer than an hour" }, { - "objectID": "logbook/posts/2024_07_05/index.html#try-running-the-code", - "href": "logbook/posts/2024_07_05/index.html#try-running-the-code", - "title": "Day 3", - "section": "11.41-11.46, 11.52-12.00: Try running the code", - "text": "11.41-11.46, 11.52-12.00: Try running the code\nI copied over server.R and, on opening, it said that plyr and shiny were required but not installed, so I add these to the environment as well.\nOn reflection, I realised that the settings to only store dependencies from DESCRIPTION in renv.lock probably wouldn’t be great, in case hidden things were also installed, so changed this setting to “implicit” (which is default).\nI ran the file and it did the command shiny, but said Error: object 'shiny' not found. I copied over all the files and tried again. It ran the script but nothing happened. Based on the Shiny documentation, I moved the files into a folder called app and run the following in R console:\nlibrary(shiny)\nrunApp(\"app\")\nThis opened up a shiny app, but got an error “there is no package called ‘markdown’”. I add this to the environment and tried again.\nThis ran the app successfully.\nHowever, from having looked at the app online, I knew that the figures it produced are not what I need to reproduce the results presented in the paper." + "objectID": "logbook/posts/2024_07_12/index.html#stars-framework", + "href": "logbook/posts/2024_07_12/index.html#stars-framework", + "title": "Day 8", + "section": "11.07-11.16: STARS Framework", + "text": "11.07-11.16: STARS Framework" }, { - "objectID": "logbook/posts/2024_07_05/index.html#getting-the-raw-model-results", - "href": "logbook/posts/2024_07_05/index.html#getting-the-raw-model-results", - "title": "Day 3", - "section": "12.07-12.21, 13.00-13.21, 13.28-13.41: Getting the raw model results", - "text": "12.07-12.21, 13.00-13.21, 13.28-13.41: Getting the raw model results\nI copied the function simulate_nav from server.R. Looking through it, there was only one part still using shiny - the progress bar - and I removed those lines of code, then add a call for the function at the end of the script (simulate_nav()), and ran it. This ran for a while, which was a little odd given how quick the app was.\nI tried running it with a very short run time (simulate_nav(run_t=60)) and this returned results!\nI borrowed from the plot_nav() function in server.R to help process the results.\nI add the reproduction.Rmd to the Quarto site, but this had issues since the Quarto book renv is seperate to the analysis renv. Based on this forum post, there are two possible solutions:\n\nIntegrate the .html file produced from the .Rmd into the book, so it is pre-rendered, and set the .Rmd to Render on Save.\nAdd the packages needed for the book to the analysis renv.\n\nHowever, it appears you’d have to copy the .html code into the Quarto document. So, decided on the simpler solution of adding the required packages for the book to the analysis environment. I deleted the environment in the main folder." + "objectID": "logbook/posts/2024_07_12/index.html#stress-des", + "href": "logbook/posts/2024_07_12/index.html#stress-des", + "title": "Day 8", + "section": "11.26-11.51, 12.00-12.17, 13.04-13.18: STRESS-DES", + "text": "11.26-11.51, 12.00-12.17, 13.04-13.18: STRESS-DES\n\nUncertain\n\n\n\n\n\n\n\nItem\nMy comments\n\n\n\n\nSTRESS-DES 1.2 Model outputs. Define all quantitative performance measures that are reported, using equations where necessary. Specify how and when they are calculated during the model run along with how any measures of error such as confidence intervals are calculated.\nIt does describe the measures, and how these are calculated, and so I have said it met these criteria, although I did find it hard to understand/calculate the relative probability of waiting, and would’ve benefited from further detail/equations\n\n\nSTRESS-DES 1.3 Experimentation aims. If the model has been used for experimentation, state the objectives that it was used to investigate. (A) Scenario based analysis – Provide a name and description for each scenario, providing a rationale for the choice of scenarios and ensure that item 2.3 (below) is completed.\nI feel the paper does describe the scenarios clearly - my only hesitation is that I have been unable to successfully implement the exclusive use scenario - but that feels like a coding issue rather than a description issue? As, on the face of it, the article describes everything I need to know.\n\n\nSTRESS-DES 3.2 Pre-processing. Provide details of any data manipulation that has taken place before its use in the simulation, e.g. interpolation to account for missing data or the removal of outliers.\nNone provided, so presumed not applicable - but hard to say, as maybe there was just unmentioned. But as not possible to know either way, assumed not-applicable\n\n\nISPOR SDM 15 Is the model generalizability issue discussed?\nNot sure if it is partially or fully met?\n\n\n12 Is cross validation performed and reported\nIs it not met or not applicable? Introduction: “In contrast to other healthcare fields, a resource-use optimization model has not been implemented\n\n\nfor comprehensive stroke services.” Huang et al. (2019)" }, { - "objectID": "logbook/posts/2024_07_05/index.html#checking-model-parameters", - "href": "logbook/posts/2024_07_05/index.html#checking-model-parameters", - "title": "Day 3", - "section": "13.42-14.13: Checking model parameters", - "text": "13.42-14.13: Checking model parameters\n\nComparing parameters\nTable 1 provides the parameters for the model. I compared these against the function inputs (as the model have no comments/docstrings, it took a little while to make sure I was matching up the right things).\nPhysical and human resources:\n\n\n\n\n\n\n\n\nParameter\nPaper\nScript\n\n\n\n\nAngiography machine for INR and IR\n1\nangio_inr = 1\n\n\nAngiography machine for IR only\n1\nangio_ir = 1\n\n\nCT\n2\nct = 2\n\n\nInterventional neuroradiologist\n1 24h\ninr = 1 and inr_night = 1\n\n\nInterventional radiologist\n2 8am-5pm 1 5pm-8am\nir = 1 and ir_night = 1\n\n\nAngiography staff\n6 8am-5pm 3 5pm-8am\nangio_staff = 10 and angio_staff_night = 3\n\n\nED team\n10 24h\ned_staff = 10\n\n\nStroke team\n1 24h\nstroke_staff = 1\n\n\n\nFor the shifts parameter: shifts = c(8,17)\nPatients:\n\n\n\nParameter\nPaper N\nPaper IAT\nScript\n\n\n\n\nED\n107,700\n5\ned_pt = 107000\n\n\nSuspected stroke\n750\n701\nst_pt = 750\n\n\nAIS\n450\n1168\nais_pt = 450\n\n\nECR\n58\n9062\necr_pt = 58\n\n\nElective INR\n104\n5054\ninr_pt = 300\n\n\nEmergency IR\n468\n1123\neir_pt= 1000\n\n\nElective IR\n3805\n138\nir_pt = 4000\n\n\n\nI also compared some other parameters mentioned in the paper:\n\nSimulated each scenario 30 times - nsim = 1\nRuntime 365 days - run_t = 10000\n\n\n\nCorrecting differences\n\nInterventional neuroradiologist: inr_night = 0\nInterventional radiologist: ir = 2\nAngiography staff: angio_staff = 6\nED: ed_pt = 107700\nElective INR: inr_pt = 104\nEmergency INR: eir_pt= 468\nElective IR: ir_pt = 3805\nReplications: nsim=30\nRun time…\n\nIn the paper, run time is 365 days\nIn the script, run_t = 10000 and RUN_T = run_t * 40320\nDeduced that time unit is minutes\nThis is set up for the app, where user inputs the run time in months, and 40320 minutes = 28 days\nTo more easily reproduce paper (with run time 365 days), modified script so input is in days (which are then converted to minutes for RUN_T)" + "objectID": "logbook/posts/2024_07_12/index.html#des-checklist-derived-from-ispor-sdm", + "href": "logbook/posts/2024_07_12/index.html#des-checklist-derived-from-ispor-sdm", + "title": "Day 8", + "section": "13.19-13.33, 13.39-13.43: DES checklist derived from ISPOR-SDM", + "text": "13.19-13.33, 13.39-13.43: DES checklist derived from ISPOR-SDM" }, { - "objectID": "logbook/posts/2024_07_05/index.html#fixing-environment", - "href": "logbook/posts/2024_07_05/index.html#fixing-environment", - "title": "Day 3", - "section": "14.22-14.27: Fixing environment", - "text": "14.22-14.27: Fixing environment\nThe build of the book on GitHub failed:\nConfiguration failed because libcurl was not found. Try installing:\n * deb: libcurl4-openssl-dev (Debian, Ubuntu, etc)\n * rpm: libcurl-devel (Fedora, CentOS, RHEL)\nIf libcurl is already installed, check that 'pkg-config' is in your\nPATH and PKG_CONFIG_PATH contains a libcurl.pc file. If pkg-config\nis unavailable you can set INCLUDE_DIR and LIB_DIR manually via:\nR CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...'\nBased on this GitHub issue, add installation of this to the action." + "objectID": "logbook/posts/2024_07_12/index.html#timings-for-evaluation", + "href": "logbook/posts/2024_07_12/index.html#timings-for-evaluation", + "title": "Day 8", + "section": "Timings for evaluation", + "text": "Timings for evaluation\n\nimport sys\nsys.path.append('../')\nfrom timings import calculate_times\n\n# Minutes used prior to today\nused_to_date = 0\n\n# Times from today\ntimes = [\n ('10.58', '11.06'),\n ('11.07', '11.16'),\n ('11.26', '11.51'),\n ('12.00', '12.17'),\n ('13.04', '13.18'),\n ('13.19', '13.33'),\n ('13.39', '13.43')]\n\ncalculate_times(used_to_date, times, limit=False)\n\nTime spent today: 91m, or 1h 31m\nTotal used to date: 91m, or 1h 31m" }, { - "objectID": "logbook/posts/2024_07_05/index.html#in-text-results-1-and-2", - "href": "logbook/posts/2024_07_05/index.html#in-text-results-1-and-2", - "title": "Day 3", - "section": "14.29-15.11, 15.32-16.23: In-text results 1 and 2", - "text": "14.29-15.11, 15.32-16.23: In-text results 1 and 2\nThe provided processing scripts may be able to help guide us, but not provided will create the Figures in the paper, so we do need to write that from scratch.\nAlthough the article focuses on the AngioINR, the plot includes 6 resources. The resources are provided by simmer’s get_mon_resources().\nWe’ll start with Figure 2 and its scenarios - with the related in-text results 1 and 2 probbaly being the easiest to initially check.\nThe plot the angio INR wait times, which can be obtained from the arrivals dataframe.\nI created a function that runs the model with the baseline parameters identified above, then looked to the Figure 2 model variants.\n\nExclusive use\nIn this scenario, AngioINR not available to elective IR patients. It is available to stroke, selective INR and emergency IR patients.\nLooking at the model code, use of the angioINR is controlled by a seize(\"angio_inr\", 1) statement in the trajectory() for each patient. Can see that it is seized in:\n\necr_traj (ECR)\nir_traj (Elective IR)\ninr_traj (Elective INR)\neir_traj (Emergency INR)\n\nHence, add an exclusive_use statement and conditional section to remove angio_inr as an option to choose from when the scenario is active for the ir_traj trajectory.\n\n\nTwo angioINRs scenario\nThis was super easy to change with the angio_inr parameter.\n\n\nCheck in-text results 1 and 2\nRan each of the scenarios and found the mean waiting time for each resource across all replications. Results for AngioINR were:\n\nBaseline: 86.99 minutes\nExclusive use: 63.33 minutes\nTwo AngioINR: 52.78 minutes\n\nThis is markedly more than in the paper (exclusive reduces by 6 min, and two angioINRs reduces by 4 min). The median was even more different.\nThis was looking at the waiting time for all patient types though. And the interest of the paper is in stroke (“The elective INR, elective IR and emergency IR pathways are modeled because they utilize resources shared with the stroke pathway.” Huang et al. (2019))\nThe results have 4 categories: ed, ir, eir, and inr. Hence, it appears ED should be stroke - and indeed, in paper, the stroke pathway begins with a new patient in the emergency department (ED). When filtered just to those patients…\nMean wait times are:\n\nBaseline 307.83 minutes\nExclusive: 292.18 minutes\nTwo AngioINR: 319.94 minutes\n\nMedian wait times for the AngioINR are:\n\nBaseline: 206.53 minutes\nExclusive: 199.03 minutes\nTwo AngioINR: 244.27 minutes\n\nBy the median times, we’re fairly close to the paper (comparing the averages, it 7 minutes quicker). However, two angioINR is very different, and I’m a little sceptical as to whether I’ve got it quite right.\n\n\n\n\n\n\nReflections\n\n\n\nDisregarding my attempts to backdate R and the packages, the provided code was actually quite simple to get up and running as a shiny app.\nHowever, it was provided with the article more for that purpose, than to be producing the items in the article, as the base parameters of the model differ, and as there is no code to process and generate the figures and results.\nI’ll keep working in latest R and packages, as current focus of this stage is just to try and reproduce the items. However, it would be good to try and figure out how to successfully backdate R and the packages, as that feels like an essential thing to be able to do, that I just hadn’t managed to get to the bottom of yet." + "objectID": "logbook/posts/2024_07_12/index.html#untimed-working-on-research-compendium-stage", + "href": "logbook/posts/2024_07_12/index.html#untimed-working-on-research-compendium-stage", + "title": "Day 8", + "section": "Untimed: Working on research compendium stage", + "text": "Untimed: Working on research compendium stage\nSome tidying up and sorting for research compendium stage inc.\n\nWorking on README for reproduction\nLooking into options for unit testing in R…\n\nPackage testthat\nuse_testthat(). This initializes the unit testing machinery for your package. It adds Suggests: testthat to DESCRIPTION, creates the directory tests/testthat/, and adds the script tests/testthat.R.\nuse_test(\"functionname\") to create matching testfile.\nlibrary(testthat), load_all(), test() to run the test. Tests will also run whenever check() package\nrename_files(\"strsplit1\", \"str_split_one\") to rename the R file and will also rename testthat file (which we also edit with new function name), to fit with convention of filename matching function name\nCan use expect_equal() to compare two dataframes\nFile structure: tests/, testthat.R, testthat, helper_func1.R, helper_func2.R, test_name.R\nTest files prefixed test_, keep data in files prefixed helper_" }, { - "objectID": "logbook/posts/2024_07_05/index.html#continuing-to-troubleshoot-in-text-results-1-and-2", - "href": "logbook/posts/2024_07_05/index.html#continuing-to-troubleshoot-in-text-results-1-and-2", - "title": "Day 3", - "section": "16.30-16.37, 16.43-16.48, 16.55-16.57: Continuing to troubleshoot in-text results 1 and 2", - "text": "16.30-16.37, 16.43-16.48, 16.55-16.57: Continuing to troubleshoot in-text results 1 and 2\nI realised that perhaps my issue as in incorrectly assuming that I should set inr_night to 0. There should be one INR person 24h, but because all the staff get put on a schedule, by removing the “night” person I technically only have someone during day time hours.\nI changed this and re-ran (with timer - can see it took 6.3 minutes).\nThis was definitely a fix - the waiting times now look far closer to what I expected (around 10 minutes rather than 200!). The median results are very small, but looking at the mean results:\n\nBaseline: 13.33 minutes\nExclusive: 8.58 minutes\nTwo AngioINR: 14.86 minutes\n\nHowever, still not quite right… 4.7 minute reduction for exclusive (should be 6 minutes) and 1.5 minute increase for two machines (should be 4 minute reduction). The exclusive is pretty close, although its not yet clear to me how much it varies between runs, and whether that could be reasonably attributed to be stochasticity or not. Given we’re comparing fairly small numbers, it is a bit on the fence for me, and wouldn’t yet say I feel confident in it being successfully reproduced.\nI tried re-running it all to see how much the results differed - and it was by a fair bit actually! Up to about a minute:\n\nBaseline: 13.65 minutes\nExclusive: 9.20 minutes\nTwo AngioINR: 13.61 minutes\n\nHowever, differences are still off the reported - 4.45 minute reduction and 0.01 minute reduction." + "objectID": "logbook/posts/2024_07_09/index.html", + "href": "logbook/posts/2024_07_09/index.html", + "title": "Day 5", + "section": "", + "text": "Note\n\n\n\nWorking on figures 2 + 3 and in-text result 3. Plus (untimed) fixing Quarto book (environment issues). Total time used: 16h 15m (40.6%)." }, { - "objectID": "logbook/posts/2024_07_05/index.html#timings", - "href": "logbook/posts/2024_07_05/index.html#timings", - "title": "Day 3", + "objectID": "logbook/posts/2024_07_09/index.html#continuing-on-figure-2", + "href": "logbook/posts/2024_07_09/index.html#continuing-on-figure-2", + "title": "Day 5", + "section": "09.04-09.06, 09.14-09.15: Continuing on Figure 2", + "text": "09.04-09.06, 09.14-09.15: Continuing on Figure 2\nI was curious to see how a different seed would impact the appearance of the figures, and so tried changing the seed from 200 to 300. However, it looks fairly similar.\n\n\n\nFigure 2A Example 1\n\n\nAnd with seed 500 too:\n\n\n\nFigure 2A Example 2" + }, + { + "objectID": "logbook/posts/2024_07_09/index.html#untimed-fixing-github-commits-and-action-for-quarto-book", + "href": "logbook/posts/2024_07_09/index.html#untimed-fixing-github-commits-and-action-for-quarto-book", + "title": "Day 5", + "section": "Untimed: Fixing GitHub commits and action for Quarto book", + "text": "Untimed: Fixing GitHub commits and action for Quarto book\nThis is not timed as I feel it is relevant to the Quarto book and not specific to this reproduction, and so reflects an issue I might have ironed out in a test-run, if I had done a second test-run in R (and not just a Python test-run).\nHad commit the produced .csv files without recognising they were too large. Undid commits with git reset HEAD^, and switched reproduction to only save relevant rows and columns, and to save as a compressed .csv.gz file. This required adding R.utils to the environment.\nAlso, modified quarto_publish.yaml to use setup-r-dependencies, but ran into several errors with this. One I could resolve related to having not pushed the renv/ directory. However, one I have struggled to resolve, which was that there is no package called ‘pak’. I’ve tried switching to ubuntu-22.04, as suggested on this issue. Also tried adding pak within the setup action with extra-packages: | any::pak. Still, issue persists.\nI explored using conda to manage the R environment, and whether that might actually be easier, as I’ve had alot of challenges with renv for this book (but also in general, having just defaulted to using the latest packages, due to facing major issues installing older R and packages). Based on this tutorial, I created a requirements.txt file then ran the following:\nconda create -n huang2019\nconda activate huang2019\nconda install -c conda-forge r-base==4.4.1 --file reproduction/requirements.txt\nHowever, this was running into several issues, stating that the packages were not compatabile with the chosen r-base.\nFinally, I tried switching back to setup-renv. However, this took a long time to run but it does run (and supposedly future runs can use that cache so it is quicker). However, just like before, it stalls with an error (despite seeing that the renv installation above definitely included rmarkdown):\n[19/22] reproduction/reproduction.Rmd\nError in loadNamespace(x) : there is no package called ‘rmarkdown’\nCalls: loadNamespace -> withRestarts -> withOneRestart -> doWithOneRestart\nExecution halted\nR installation:\n Version: 4.4.1\n Path: /opt/R/4.4.1/lib/R\n LibPaths:\n - /home/runner/work/_temp/Library\n - /opt/R/4.4.1/lib/R/library\n knitr: (None)\n rmarkdown: (None)\nThe knitr package is not available in this R installation.\nInstall with install.packages(\"knitr\")\nThe rmarkdown package is not available in this R installation.\nInstall with install.packages(\"rmarkdown\")\nERROR: Error\n at renderFiles (file:///opt/quarto/bin/quarto.js:78081:29)\n at eventLoopTick (ext:core/01_core.js:153:7)\n at async renderProject (file:///opt/quarto/bin/quarto.js:78479:25)\n at async renderForPublish (file:///opt/quarto/bin/quarto.js:109334:33)\n at async renderForPublish (file:///opt/quarto/bin/quarto.js:104866:24)\n at async Object.publish1 [as publish] (file:///opt/quarto/bin/quarto.js:105351:26)\n at async publishSite (file:///opt/quarto/bin/quarto.js:109371:38)\n at async publish7 (file:///opt/quarto/bin/quarto.js:109590:61)\n at async doPublish (file:///opt/quarto/bin/quarto.js:109550:13)\n at async publishAction (file:///opt/quarto/bin/quarto.js:109561:9)\nError: Process completed with exit code 1.\nTried adding Rscript{0} as shell for running R code but this was incorrect.\nThen tried switching reproduction.Rmd to reproduction.qmd. Re-running the action, it was very very slow (14 minutes) (so seemingly not using the cache). Moreover, it still hit an error as above.\nI decided a simpler solution might be to not require R in the Quarto build, and to instead ensure that any scripts using R are pre-rendered in some way (similar to how .ipynb files behave). For .ipynb, the default behaviour is that execute: enabled: false, as in the documentation. However, when run, encountered the error as above.\nTried a few options, including to manually install knitr and rmarkdown, although returned issue that 'lib = \"/usr/local/lib/R/site-library\"' is not writable.\nDid consider other options could be to clone and build examples that are set up with a GitHub action - e.g. renv example, nix example. However, for now, have decided to just disable the action and do it manually from the terminal:\n\nquarto render (rebuilds whole site)\nquarto publish (pushes to github pages)" + }, + { + "objectID": "logbook/posts/2024_07_09/index.html#returning-to-figure-2", + "href": "logbook/posts/2024_07_09/index.html#returning-to-figure-2", + "title": "Day 5", + "section": "13.34-14.30, 14.39-14.55: Returning to Figure 2", + "text": "13.34-14.30, 14.39-14.55: Returning to Figure 2\nComparing my figures to the original, although it is now more visually similar than it was, there is still a lot of mismatch compared with those graphs. I’m suspicious this could be due to scaling, as currently I am just using the built in geom_density() scaling to 1, rather than explicitly scaling to the number not waiting. I found the R scripts behind this function unclear.\nInstead, I spent some time working out how to scale these manually, ensuring I was definitely dividing each density by the density from wait_time 0, and this confirmed that it matched up with the results from geom_density()’s scaled. As such, it seems the issue is not due to the scaling.\n# Create figure as usual\np <- create_plot(res_base,\n title=\"Baseline\",\n ylab=\"Standardised density of patient in queue\")\n\n# Get data from the plot\nplot_data <- ggplot_build(p)$data[[1]]\n\n# Create dataframe with the densities for when the waitimes are 0\nno_wait <- plot_data %>% filter(x==0) %>% select(colour, density, scaled)\n#print(no_wait)\n\n# Loop through each of the colours (which reflect the resource groups)\nfor (c in no_wait$colour) {\n # Filter the plot data to that resource group, then divide the densities by\n # the density from wait time 0\n d <- plot_data %>%\n filter(colour == c) %>%\n mutate(scaled2 = density / no_wait[no_wait$colour==c, \"density\"]) %>%\n ungroup() %>%\n select(scaled, scaled2)\n\n # Find the number of rows where these values match the scaled values\n n_match <- sum(apply(d, 1, function(x) length(unique(x)) == 1))\n n_total <- nrow(d)\n print(sprintf(\"%s out of %s results match\", n_match, n_total))\n}\nGiven the scaling seems ok, the only other options I can think of are:\n\nThe environment - although I would anticipate that to be more of an issue of a model not running, rather than fundamentally changing results\nThe model parameters - I’ve had another look back over the model code, and tried changing INR night -\n\nModel was set up to have INR staff on a schedule, but in the paper they are 24 hours. I had set this up by having 1 day and 1 night staff, but I’ve tried changing the code so it’s just a single resource (like how ED team and stroke team are set up)\nOtherwise, all parameters look correct compared against Table 1\n\n\nHowever, model results came out the same. I am rather stuck on this now, so will move onto Figure 3 (having first, re-run reproduction with seed=200, as per in-text result 1)." + }, + { + "objectID": "logbook/posts/2024_07_09/index.html#starting-on-figure-3-and-in-text-result-3", + "href": "logbook/posts/2024_07_09/index.html#starting-on-figure-3-and-in-text-result-3", + "title": "Day 5", + "section": "14.56-15.26, 15.31-16.19, 16.24-16.56: Starting on Figure 3 and in-text result 3", + "text": "14.56-15.26, 15.31-16.19, 16.24-16.56: Starting on Figure 3 and in-text result 3\nFor this scenario analysis, the “day time working hours of all human resources are extended by up to 2h, extending resource access to all patients” (Huang et al. (2019)). Given how the model scheduling is set-up, it is assumed that this means we simply adjust the schedule to end at 5, 6 or 7pm (and that that would simply shortern the night staff time).\nI ran these scenarios, processing and saving the relevant model results.\nFor in-text result 3, I can see that the results do not match up to the paper. I am not surprised by this though - as the model had no seed control, as it is not mentioned in the paper, we can assume that it might not have been used by the original study, and so variation between the scenarios could (in part) reflect model stochasticity.\n\nimport pandas as pd\n\npd.read_csv(\"txt3.csv\")\n\n\n\n\n\n\n\n\n\nscenario\nshift\nmean\ndiff_from_5pm\n\n\n\n\n0\nBaseline\n5pm\n13.958269\n0.00\n\n\n1\nBaseline\n6pm\n12.486042\n-1.47\n\n\n2\nBaseline\n7pm\n12.491421\n-1.47\n\n\n3\nExclusive use\n5pm\n8.117729\n0.00\n\n\n4\nExclusive use\n6pm\n7.802954\n-0.31\n\n\n5\nExclusive use\n7pm\n6.432643\n-1.69\n\n\n6\nTwo AngioINRs\n5pm\n13.511560\n0.00\n\n\n7\nTwo AngioINRs\n6pm\n11.408894\n-2.10\n\n\n8\nTwo AngioINRs\n7pm\n11.256842\n-2.25\n\n\n\n\n\n\n\n\nTo test this assumption, I ran the model again for baseline with two further seeds. We can see the importance of seed control here. For example, with seed 700, we see a broader range of results, with the result for 6pm (13.32) is much higher than for the other two seeds and, compared with their 5pm results, we would’ve seen less of a reduction. Similarly, if we compared the 5pm seed 700 result with the 6pm seed 500 result, we would see a much greater reduction.\n\npd.read_csv(\"txt3_seeds.csv\")\n\n\n\n\n\n\n\n\n\nscenario\n5pm\n6pm\n7pm\n\n\n\n\n0\nBaseline\n13.96\n12.49\n12.49\n\n\n1\nBaseline (seed 500)\n13.96\n12.15\n12.20\n\n\n2\nBaseline (seed 700)\n15.47\n13.32\n12.30\n\n\n\n\n\n\n\n\nFor Figure 3, it was simple to adapt the function to create it but, similar to Figure 2, there are several differences in the original study results.\n\n\n\nFigure 3" + }, + { + "objectID": "logbook/posts/2024_07_09/index.html#timings", + "href": "logbook/posts/2024_07_09/index.html#timings", + "title": "Day 5", "section": "Timings", - "text": "Timings\n\nimport sys\nsys.path.append('../')\nfrom timings import calculate_times\n\n# Minutes used prior to today\nused_to_date = 149\n\n# Times from today\ntimes = [\n ('09.46', '09.47'),\n ('09.48', '10.21'),\n ('10.40', '11.30'),\n ('11.35', '11.41'),\n ('11.41', '11.46'),\n ('11.52', '12.00'),\n ('12.07', '12.21'),\n ('13.00', '13.21'),\n ('13.28', '13.41'),\n ('13.42', '14.13'),\n ('14.22', '14.27'),\n ('14.29', '15.11'),\n ('15.32', '16.23'),\n ('16.30', '16.37'),\n ('16.43', '16.48'),\n ('16.55', '16.57')]\n\ncalculate_times(used_to_date, times)\n\nTime spent today: 294m, or 4h 54m\nTotal used to date: 443m, or 7h 23m\nTime remaining: 1957m, or 32h 37m\nUsed 18.5% of 40 hours max" + "text": "Timings\n\nimport sys\nsys.path.append('../')\nfrom timings import calculate_times\n\n# Minutes used prior to today\nused_to_date = 790\n\n# Times from today\ntimes = [\n ('09.04', '09.06'),\n ('09.14', '09.15'),\n ('13.34', '14.30'),\n ('14.39', '14.55'),\n ('14.56', '15.26'),\n ('15.31', '16.19'),\n ('16.24', '16.56')]\n\ncalculate_times(used_to_date, times)\n\nTime spent today: 185m, or 3h 5m\nTotal used to date: 975m, or 16h 15m\nTime remaining: 1425m, or 23h 45m\nUsed 40.6% of 40 hours max" }, { - "objectID": "logbook/posts/2024_07_22/index.html", - "href": "logbook/posts/2024_07_22/index.html", - "title": "Day 13", + "objectID": "logbook/posts/2024_07_19/index.html", + "href": "logbook/posts/2024_07_19/index.html", + "title": "Day 12", "section": "", - "text": "Note\n\n\n\nTom’s test run of the model." + "text": "Note\n\n\n\nFinishing up research compendium: final bit of troubleshooting docker, then GHCR." }, { - "objectID": "logbook/posts/2024_07_22/index.html#untimed-test-run-by-second-member-of-stars-team", - "href": "logbook/posts/2024_07_22/index.html#untimed-test-run-by-second-member-of-stars-team", - "title": "Day 13", - "section": "Untimed: Test run by second member of STARS team", - "text": "Untimed: Test run by second member of STARS team\nTom attempted to run the model from my reproduction/ folder.\nWas able to run the tests fine, and also ran some of the scripts.\nThe renv install okay - just needed to install some operating system dependencies via apt, but likely as that was the first time he’d used R on that machine.\nThe local build of the docker image worked fine first time. Launched RStudio server and ran testthat without an issue.\nNoted that in both cases RStudio was using 8GB RAM.\nWasn’t able to run it on his virtual machine (by default, that only allocates 4GB RAM, so that would be why)." + "objectID": "logbook/posts/2024_07_19/index.html#untimed-research-compendium", + "href": "logbook/posts/2024_07_19/index.html#untimed-research-compendium", + "title": "Day 12", + "section": "Untimed: Research compendium", + "text": "Untimed: Research compendium\n\nDocker\nResuming where I left off yesterday.\nCurrent challenge is to try and install stringi and openssl into the renv, so the later renv::restore() doesn’t fail.\n\nImportant commands when troubleshooting\nReminder of key commands:\n\nBuild image: sudo docker build --tag huang2019 . -f ./docker/Dockerfile\nDelete image: sudo docker image rm huang2019\nCreate container and open RStudio: (sleep 2 && xdg-open http://localhost:8888) & sudo docker run -it -p 8888:8787 -e DISABLE_AUTH=true --name huang2019_docker huang2019\nDelete container: sudo docker rm huang2019_docker\n\n\n\nUnsuccessful attempts\nI tried variants of:\n\nPermissions (USER root, USER rstudio)\nInstallation instructions (remotes, renv, install.packages).\n\nI seemed to be getting success with:\nRUN R -e \"renv::activate()\"\nUSER root\nRUN R -e \"renv::install('stringi@${STRINGI_VERSION}')\"\nRUN R -e \"renv::install('openssl@${OPENSSL_VERSION}')\"\nUSER rstudio\n#RUN R -e \"remotes::install_version('openssl', version='${OPENSSL_VERSION}')\"\nRUN R -e \"renv::restore(lockfile=\\\"${PROJDIRECTORY}/renv.lock\\\", repos = c(CRAN = \\\"https://packagemanager.rstudio.com/all/__linux__/focal/latest\\\"))\"\nThis installed stringi and openssl into the renv successfully, although I seemed to need to have USER root permissions. For renv::restore(), it installed fine without needing to be USER root, but it then failed when installing stringi, so it appears to not have resolved the issue.\nError in dyn.load(file, DLLpath = DLLpath, ...) : \n unable to load shared object '/tmp/Rtmp8ogTfT/renv-staging-7b6bc3cd/stringi/libs/stringi.so':\n libicui18n.so.66: cannot open shared object file: No such file or directory\nI tried running all the renv installation whilst being the USER root. The image built successfully, but it did not open as an active project, and the renv/ folder only contained renv.\nI tried just running renv::install() (and not specific installs or restore), but this had errors of:\n\nrenv appears to be unable to access the requested library path: /home/rstudio/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu. Check that the 'rstudio' user has read / write access to this directory.\nError: error downloading 'https://cloud.r-project.org/src/contrib/mime_0.12.tar.gz' [cannot open URL 'https://cloud.r-project.org/src/contrib/mime_0.12.tar.gz']\n\n\n\nMinimal example (small .lock and specific files) succeeds\nI tried temporarily replacing my lockfile with a simple one with only my packages markdown and mime, and renv::restore() under user rstudio (similar to the GitHub issue from yesterday).\n\nWhen running renv::restore(), it seemed to install its own copy of renv (and didn’t use the one I’d installed above) - and indeed, I found I could remove that from the Dockerfile with no impact on the outcome\nThe library was successfully installed and accessible when I opened the container!\n\n{\n \"R\": {\n \"Version\": \"4.4.1\",\n \"Repositories\": [\n {\n \"Name\": \"CRAN\",\n \"URL\": \"https://cloud.r-project.org\"\n }\n ]\n },\n \"Packages\": {\n \"markdown\": {\n \"Package\": \"markdown\",\n \"Version\": \"1.13\",\n \"Source\": \"Repository\",\n \"Repository\": \"CRAN\",\n \"Requirements\": [\n \"R\",\n \"commonmark\",\n \"utils\",\n \"xfun\"\n ],\n \"Hash\": \"074efab766a9d6360865ad39512f2a7e\"\n },\n \"markdown\": {\n \"Package\": \"markdown\",\n \"Version\": \"1.13\",\n \"Source\": \"Repository\",\n \"Repository\": \"CRAN\",\n \"Requirements\": [\n \"R\",\n \"commonmark\",\n \"utils\",\n \"xfun\"\n ],\n \"Hash\": \"074efab766a9d6360865ad39512f2a7e\"\n }\n }\n}\nWhen I did that successful run, I’d only copied over a few essential / example files\nCOPY renv.lock renv.lock\nCOPY reproduction.Rproj reproduction.Rproj\nCOPY scripts scripts\nInstead of\nCOPY . .\nHowever, when I switched back to just copying everything, I get issues that it cannot copy and move files and that permission is denied.\nI tried manually specifying everything from the folder (exc. .Rhistory and .Rproj.user)…\nCOPY DESCRIPTION DESCRIPTION\nCOPY docker docker\nCOPY outputs outputs\nCOPY README.md README.md\nCOPY renv.lock renv.lock\nCOPY reproduction.Rproj reproduction.Rproj\nCOPY scripts scripts\nCOPY tests tests\n…And that built fine.\nSo I tried again with COPY . ., but adding .Rhistory and .Rproj.user to the .dockerignore - but this failed like before. Hence, I decided to stick with specifying the files being copied (and regardless, I guess that has the benefit of being specific about what we include). It appears I must be copying over something undesirable when running COPY . . which is causing us issues, although I can’t spot what this might be.\n\n\nTroubleshooting stringi\nI ran renv::snapshot() to restore the lock file back to being complete, and then tried to build the image again. This failed with the libicui18n.so.66 error from before. I reverted the lockfile back to the simple version (so the various test runs are quicker), but adding stringi, getting the same error.\nTried adding install before restore - RUN R -e \"renv::install('stringi')\" (which automatically installs renv for us before running)…. and it was successfull….! The library contained stringi and the other packages from the lockfile.\nSo, I then, again, restored the full lockfile, add an install for openssl, and tried once more.\nThis was successful!\n\n\nGiving read, write and save access to folders\nAll the files are present and can be run, and the renv is active with all the required files. However, if we want to save anything (e.g. modifying qmd, or saving output from model with ggsave), we don’t currently have permissions.\nBased on the docker documentation, I tried using --chown with the COPY statements to specifically give permissions to the user rstudio. I also modified stringi and openssl so they have the specific versions.\nThis worked!\n\n\n\nGitHub Container Registry\nActivated and ran but hit issue on COPY renv/activate.R renv/activate.R. It cannot find the file - although the previous commands with relative file paths all ran without issue.\nERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 70b54bab-f7c4-4333-a94b-def3ee959db6::iqqrpwic0590fua1x3sv0utsd: \"/renv/activate.R\": not found\nChecking on GitHub, the activate.R file is included. However, in my prior example of this (Shoaib et al. 2022), I ran the dockerfile from the main folder rather than the reproduction folder. Hence, I tried updating the Dockerfile so that the file paths are relative to reproduction’s parent, which fixed the issue.\nI then tested downloading the image from GHCR and ran one of the scripts within that, and it all worked fine. Add instructions for this to the README.\n\n\nSummary report\nFilled out the summary report template." + }, + { + "objectID": "logbook/posts/2024_11_21/index.html", + "href": "logbook/posts/2024_11_21/index.html", + "title": "Day 19", + "section": "", + "text": "Note\n\n\n\nRedid badge evaluation." + }, + { + "objectID": "logbook/posts/2024_11_21/index.html#revisit-evaluation", + "href": "logbook/posts/2024_11_21/index.html#revisit-evaluation", + "title": "Day 19", + "section": "09.53-09.57: Revisit evaluation", + "text": "09.53-09.57: Revisit evaluation\nRevisited and revised the badge criteria to (a) make them up-to-date, and (b) make sure they are specific to the descriptions from each badge. Hence, redoing evaluations for all eight studies.\nNotes:\n\nRelevant - yes, as its the model needed, even if it is within an app\nExecutes - yes, although required significant troubleshooting, as I had to extract it from app code\n\nRan this by Tom who agreed. Results remain the same (3 criteria, 0 badge)." }, { "objectID": "logbook/posts/2024_07_03/index.html", @@ -375,7 +417,7 @@ "href": "logbook/logbook.html", "title": "Logbook", "section": "", - "text": "These diary entries record daily progress in reproduction of the study, providing a transparent and detailed record of work.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nDay 17\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nOct 2, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 16\n\n\n\n\n\n\nevaluation\n\n\n\n\n\n\n\n\n\nSep 3, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 15\n\n\n\n\n\n\nevaluation\n\n\n\n\n\n\n\n\n\nAug 15, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 14\n\n\n\n\n\n\nreproduction\n\n\n\n\n\n\n\n\n\nAug 12, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 13\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 22, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 12\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 19, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 11\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 18, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 10\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 16, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 9\n\n\n\n\n\n\nguidelines\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 15, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 8\n\n\n\n\n\n\nreproduce\n\n\nguidelines\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 12, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 7\n\n\n\n\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 11, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 6\n\n\n\n\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 10, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 5\n\n\n\n\n\n\nsetup\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 9, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 4\n\n\n\n\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 8, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 3\n\n\n\n\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 5, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 2\n\n\n\n\n\n\nsetup\n\n\nscope\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 4, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 1\n\n\n\n\n\n\nsetup\n\n\n\n\n\n\n\n\n\nJul 3, 2024\n\n\nAmy Heather\n\n\n\n\n\n\nNo matching items" + "text": "These diary entries record daily progress in reproduction of the study, providing a transparent and detailed record of work.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nDay 18\n\n\n\n\n\n\nevaluation\n\n\n\n\n\n\n\n\n\nNov 4, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 19\n\n\n\n\n\n\nevaluation\n\n\n\n\n\n\n\n\n\nOct 21, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 17\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nOct 2, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 16\n\n\n\n\n\n\nevaluation\n\n\n\n\n\n\n\n\n\nSep 3, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 15\n\n\n\n\n\n\nevaluation\n\n\n\n\n\n\n\n\n\nAug 15, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 14\n\n\n\n\n\n\nreproduction\n\n\n\n\n\n\n\n\n\nAug 12, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 13\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 22, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 12\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 19, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 11\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 18, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 10\n\n\n\n\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 16, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 9\n\n\n\n\n\n\nevaluation\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 15, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 8\n\n\n\n\n\n\nreproduce\n\n\nevaluation\n\n\ncompendium\n\n\n\n\n\n\n\n\n\nJul 12, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 7\n\n\n\n\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 11, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 6\n\n\n\n\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 10, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 5\n\n\n\n\n\n\nsetup\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 9, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 4\n\n\n\n\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 8, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 3\n\n\n\n\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 5, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 2\n\n\n\n\n\n\nsetup\n\n\nscope\n\n\nreproduce\n\n\n\n\n\n\n\n\n\nJul 4, 2024\n\n\nAmy Heather\n\n\n\n\n\n\n\n\n\n\n\n\nDay 1\n\n\n\n\n\n\nsetup\n\n\n\n\n\n\n\n\n\nJul 3, 2024\n\n\nAmy Heather\n\n\n\n\n\n\nNo matching items" }, { "objectID": "evaluation/reflections.html", @@ -410,28 +452,28 @@ "href": "evaluation/badges.html", "title": "Journal badges", "section": "", - "text": "This page evaluates the extent to which the author-published research artefacts meet the criteria of badges related to reproducibility from various organisations and journals.\nCaveat: Please note that these criteria are based on available information about each badge online, and that we have likely differences in our procedure (e.g. allowed troubleshooting for execution and reproduction, not under tight time pressure to complete). Moreover, we focus only on reproduction of the discrete-event simulation, and not on other aspects of the article. We cannot guarantee that the badges below would have been awarded in practice by these journals." + "text": "This page evaluates the extent to which the author-published research artefacts meet the criteria of badges related to reproducibility from various organisations and journals.\nCaveat: Please note that these criteria are based on available information about each badge online. Moreover, we focus only on reproduction of the discrete-event simulation, and not on other aspects of the article. We cannot guarantee that the badges below would have been awarded in practice by these journals." }, { "objectID": "evaluation/badges.html#criteria", "href": "evaluation/badges.html#criteria", "title": "Journal badges", "section": "Criteria", - "text": "Criteria\n\n\nCode\nfrom IPython.display import display, Markdown\nimport numpy as np\nimport pandas as pd\n\n# Criteria and their definitions\ncriteria = {\n 'archive': 'Stored in a permanent archive that is publicly and openly accessible',\n 'id': 'Has a persistent identifier',\n 'license': 'Includes an open license',\n 'relevant': '''Artefacts are relevant to and contribute to the article's results''',\n 'complete': 'Complete set of materials shared (as would be needed to fully reproduce article)',\n 'structure': 'Artefacts are well structured/organised (e.g. to the extent that reuse and repurposing is facilitated, adhering to norms and standards of research community)',\n 'documentation_sufficient': 'Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)',\n 'documentation_careful': 'Artefacts are carefully documented (more than sufficient - i.e. to the extent that reuse and repurposing is facilitated - e.g. changing parameters, reusing for own purpose)',\n # This criteria is kept seperate to documentation_careful, as it specifically requires a README file\n 'documentation_readme': 'Artefacts are clearly documented and accompanied by a README file with step-by-step instructions on how to reproduce results in the manuscript',\n 'execute': 'Scripts can be successfully executed',\n 'regenerated': 'Independent party regenerated results using the authors research artefacts',\n 'hour': 'Reproduced within approximately one hour (excluding compute time)',\n}\n\n# Evaluation for this study\neval = pd.Series({\n 'archive': 0,\n 'id': 0,\n 'license': 1,\n 'relevant': 1,\n 'complete': 0,\n 'structure': 0,\n 'documentation_sufficient': 0,\n 'documentation_careful': 0,\n 'documentation_readme': 0,\n 'execute': 1,\n 'regenerated': 0,\n 'hour': 0,\n})\n\n# Get list of criteria met (True/False) overall\neval_list = list(eval)\n\n# Define function for creating the markdown formatted list of criteria met\ndef create_criteria_list(criteria_dict):\n '''\n Creates a string which contains a Markdown formatted list with icons to\n indicate whether each criteria was met\n\n Parameters:\n -----------\n criteria_dict : dict\n Dictionary where keys are the criteria (variable name) and values are\n Boolean (True/False of whether this study met the criteria)\n\n Returns:\n --------\n formatted_list : string\n Markdown formatted list\n '''\n callout_icon = {True: '✅',\n False: '❌'}\n # Create list with...\n formatted_list = ''.join([\n '* ' +\n callout_icon[eval[key]] + # Icon based on whether it met criteria\n ' ' +\n value + # Full text description of criteria\n '\\n' for key, value in criteria_dict.items()])\n return(formatted_list)\n\n# Define groups of criteria\ncriteria_share_how = ['archive', 'id', 'license']\ncriteria_share_what = ['relevant', 'complete']\ncriteria_doc_struc = ['structure', 'documentation_sufficient', 'documentation_careful', 'documentation_readme']\ncriteria_run = ['execute', 'regenerated', 'hour']\n\n# Create text section\ndisplay(Markdown(f'''\nTo assess whether the author's materials met the requirements of each badge, a list of criteria was produced. Between each badge (and between categories of badge), there is often alot of overlap in criteria.\n\nThis study met **{sum(eval_list)} of the {len(eval_list)}** unique criteria items. These were as follows:\n\nCriteria related to how artefacts are shared -\n\n{create_criteria_list({k: criteria[k] for k in criteria_share_how})}\n\nCriteria related to what artefacts are shared -\n\n{create_criteria_list({k: criteria[k] for k in criteria_share_what})}\n\nCriteria related to the structure and documentation of the artefacts -\n\n{create_criteria_list({k: criteria[k] for k in criteria_doc_struc})}\n\nCriteria related to running and reproducing results -\n\n{create_criteria_list({k: criteria[k] for k in criteria_run})}\n'''))\n\n\nTo assess whether the author’s materials met the requirements of each badge, a list of criteria was produced. Between each badge (and between categories of badge), there is often alot of overlap in criteria.\nThis study met 3 of the 12 unique criteria items. These were as follows:\nCriteria related to how artefacts are shared -\n\n❌ Stored in a permanent archive that is publicly and openly accessible\n❌ Has a persistent identifier\n✅ Includes an open license\n\nCriteria related to what artefacts are shared -\n\n✅ Artefacts are relevant to and contribute to the article’s results\n❌ Complete set of materials shared (as would be needed to fully reproduce article)\n\nCriteria related to the structure and documentation of the artefacts -\n\n❌ Artefacts are well structured/organised (e.g. to the extent that reuse and repurposing is facilitated, adhering to norms and standards of research community)\n❌ Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)\n❌ Artefacts are carefully documented (more than sufficient - i.e. to the extent that reuse and repurposing is facilitated - e.g. changing parameters, reusing for own purpose)\n❌ Artefacts are clearly documented and accompanied by a README file with step-by-step instructions on how to reproduce results in the manuscript\n\nCriteria related to running and reproducing results -\n\n✅ Scripts can be successfully executed\n❌ Independent party regenerated results using the authors research artefacts\n❌ Reproduced within approximately one hour (excluding compute time)" + "text": "Criteria\n\n\nCode\nfrom IPython.display import display, Markdown\nimport numpy as np\nimport pandas as pd\n\n# Criteria and their definitions\ncriteria = {\n 'archive': 'Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)',\n 'licence': 'Open licence',\n 'complete': 'Complete (all relevant artefacts available)',\n 'docs1': 'Documents (a) how code is used (b) how it relates to article (c) software, systems, packages and versions',\n 'docs2': 'Documents (a) inventory of artefacts (b) sufficient description for artefacts to be exercised',\n 'relevant': 'Artefacts relevant to paper',\n 'execute': 'Scripts can be successfully executed',\n 'careful': 'Artefacts are carefully documented and well-structured to the extent that reuse and repurposing is facilitated, adhering to norms and standards',\n 'reproduce': 'Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)',\n 'readme': 'README file with step-by-step instructions to run analysis',\n 'dependencies': 'Dependencies (e.g. package versions) stated',\n 'correspond': 'Clear how output of analysis corresponds to article'\n}\n\n# Evaluation for this study\neval = pd.Series({\n 'archive': 0,\n 'licence': 1,\n 'complete': 0,\n 'docs1': 0,\n 'docs2': 0,\n 'relevant': 1,\n 'execute': 1,\n 'careful': 0,\n 'reproduce': 0,\n 'readme': 0,\n 'dependencies': 0,\n 'correspond': 0\n})\n\n# Get list of criteria met (True/False) overall\neval_list = list(eval)\n\n# Define function for creating the markdown formatted list of criteria met\ndef create_criteria_list(criteria_dict):\n '''\n Creates a string which contains a Markdown formatted list with icons to\n indicate whether each criteria was met\n\n Parameters:\n -----------\n criteria_dict : dict\n Dictionary where keys are the criteria (variable name) and values are\n Boolean (True/False of whether this study met the criteria)\n\n Returns:\n --------\n formatted_list : string\n Markdown formatted list\n '''\n callout_icon = {True: '✅',\n False: '❌'}\n # Create list with...\n formatted_list = ''.join([\n '* ' +\n callout_icon[eval[key]] + # Icon based on whether it met criteria\n ' ' +\n value + # Full text description of criteria\n '\\n' for key, value in criteria_dict.items()])\n return(formatted_list)\n\n# Define groups of criteria\ncriteria_share_how = ['archive', 'licence']\ncriteria_share_what = ['complete', 'relevant']\ncriteria_doc_struc = ['docs1', 'docs2', 'careful', 'readme', 'dependencies', 'correspond']\ncriteria_run = ['execute', 'reproduce']\n\n# Create text section\ndisplay(Markdown(f'''\nTo assess whether the author's materials met the requirements of each badge, a list of criteria was produced. Between each badge (and between categories of badge), there is often alot of overlap in criteria.\n\nThis study met **{sum(eval_list)} of the {len(eval_list)}** unique criteria items. These were as follows:\n\nCriteria related to how artefacts are shared -\n\n{create_criteria_list({k: criteria[k] for k in criteria_share_how})}\n\nCriteria related to what artefacts are shared -\n\n{create_criteria_list({k: criteria[k] for k in criteria_share_what})}\n\nCriteria related to the structure and documentation of the artefacts -\n\n{create_criteria_list({k: criteria[k] for k in criteria_doc_struc})}\n\nCriteria related to running and reproducing results -\n\n{create_criteria_list({k: criteria[k] for k in criteria_run})}\n'''))\n\n\nTo assess whether the author’s materials met the requirements of each badge, a list of criteria was produced. Between each badge (and between categories of badge), there is often alot of overlap in criteria.\nThis study met 3 of the 12 unique criteria items. These were as follows:\nCriteria related to how artefacts are shared -\n\n❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)\n✅ Open licence\n\nCriteria related to what artefacts are shared -\n\n❌ Complete (all relevant artefacts available)\n✅ Artefacts relevant to paper\n\nCriteria related to the structure and documentation of the artefacts -\n\n❌ Documents (a) how code is used (b) how it relates to article (c) software, systems, packages and versions\n❌ Documents (a) inventory of artefacts (b) sufficient description for artefacts to be exercised\n❌ Artefacts are carefully documented and well-structured to the extent that reuse and repurposing is facilitated, adhering to norms and standards\n❌ README file with step-by-step instructions to run analysis\n❌ Dependencies (e.g. package versions) stated\n❌ Clear how output of analysis corresponds to article\n\nCriteria related to running and reproducing results -\n\n✅ Scripts can be successfully executed\n❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)" }, { "objectID": "evaluation/badges.html#badges", "href": "evaluation/badges.html#badges", "title": "Journal badges", "section": "Badges", - "text": "Badges\n\n\nCode\n# Full badge names\nbadge_names = {\n # Open objects\n 'open_niso': 'NISO \"Open Research Objects (ORO)\"',\n 'open_niso_all': 'NISO \"Open Research Objects - All (ORO-A)\"',\n 'open_acm': 'ACM \"Artifacts Available\"',\n 'open_cos': 'COS \"Open Code\"',\n 'open_ieee': 'IEEE \"Code Available\"',\n # Object review\n 'review_acm_functional': 'ACM \"Artifacts Evaluated - Functional\"',\n 'review_acm_reusable': 'ACM \"Artifacts Evaluated - Reusable\"',\n 'review_ieee': 'IEEE \"Code Reviewed\"',\n # Results reproduced\n 'reproduce_niso': 'NISO \"Results Reproduced (ROR-R)\"',\n 'reproduce_acm': 'ACM \"Results Reproduced\"',\n 'reproduce_ieee': 'IEEE \"Code Reproducible\"',\n 'reproduce_psy': 'Psychological Science \"Computational Reproducibility\"'\n}\n\n# Criteria required by each badge\nbadges = {\n # Open objects\n 'open_niso': ['archive', 'id', 'license'],\n 'open_niso_all': ['archive', 'id', 'license', 'complete'],\n 'open_acm': ['archive', 'id'],\n 'open_cos': ['archive', 'id', 'license', 'complete', 'documentation_sufficient'],\n 'open_ieee': ['complete'],\n # Object review\n 'review_acm_functional': ['documentation_sufficient', 'relevant', 'complete', 'execute'],\n 'review_acm_reusable': ['documentation_sufficient', 'documentation_careful', 'relevant', 'complete', 'execute', 'structure'],\n 'review_ieee': ['complete', 'execute'],\n # Results reproduced\n 'reproduce_niso': ['regenerated'],\n 'reproduce_acm': ['regenerated'],\n 'reproduce_ieee': ['regenerated'],\n 'reproduce_psy': ['regenerated', 'hour', 'structure', 'documentation_readme'],\n}\n\n# Identify which badges would be awarded based on criteria\n# Get list of badges met (True/False) overall\naward = {}\nfor badge in badges:\n award[badge] = all([eval[key] == 1 for key in badges[badge]])\naward_list = list(award.values())\n\n# Write introduction\n# Get list of badges met (True/False) by category\naward_open = [v for k,v in award.items() if k.startswith('open_')]\naward_review = [v for k,v in award.items() if k.startswith('review_')]\naward_reproduce = [v for k,v in award.items() if k.startswith('reproduce_')]\n\n# Create and display text for introduction\ndisplay(Markdown(f'''\nIn total, the original study met the criteria for **{sum(award_list)} of the {len(award_list)} badges**. This included:\n\n* **{sum(award_open)} of the {len(award_open)}** “open objects” badges\n* **{sum(award_review)} of the {len(award_review)}** “object review” badges\n* **{sum(award_reproduce)} of the {len(award_reproduce)}** “reproduced” badges\n'''))\n\n# Make function that creates collapsible callouts for each badge\ndef create_badge_callout(award_dict):\n '''\n Displays Markdown callouts created for each badge in the dictionary, showing\n whether the criteria for that badge was met.\n\n Parameters:\n -----------\n award_dict : dict\n Dictionary where key is badge (as variable name), and value is Boolean\n (whether badge is awarded)\n '''\n callout_appearance = {True: 'tip',\n False: 'warning'}\n callout_icon = {True: '✅',\n False: '❌'}\n callout_text = {True: 'Meets all criteria:',\n False: 'Does not meet all criteria:'}\n\n for key, value in award_dict.items():\n # Create Markdown list with...\n criteria_list = ''.join([\n '* ' +\n callout_icon[eval[k]] + # Icon based on whether it met criteria\n ' ' +\n criteria[k] + # Full text description of criteria\n '\\n' for k in badges[key]])\n # Create the callout and display it\n display(Markdown(f'''\n::: {{.callout-{callout_appearance[value]} appearance=\"minimal\" collapse=true}}\n\n## {callout_icon[value]} {badge_names[key]}\n\n{callout_text[value]}\n\n{criteria_list}\n:::\n'''))\n\n# Create badge functions with introductions and callouts\ndisplay(Markdown('''\n### \"Open objects\" badges\n\nThese badges relate to research artefacts being made openly available.\n'''))\ncreate_badge_callout({k: v for (k, v) in award.items() if k.startswith('open_')})\n\ndisplay(Markdown('''\n### \"Object review\" badges\n\nThese badges relate to the research artefacts being reviewed against criteria of the badge issuer.\n'''))\ncreate_badge_callout({k: v for (k, v) in award.items() if k.startswith('review_')})\n\ndisplay(Markdown('''\n### \"Reproduced\" badges\n\nThese badges relate to an independent party regenerating the reuslts of the article using the author objects.\n'''))\ncreate_badge_callout({k: v for (k, v) in award.items() if k.startswith('reproduce_')})\n\n\nIn total, the original study met the criteria for 0 of the 12 badges. This included:\n\n0 of the 5 “open objects” badges\n0 of the 3 “object review” badges\n0 of the 4 “reproduced” badges\n\n\n\n“Open objects” badges\nThese badges relate to research artefacts being made openly available.\n\n\n\n\n\n\n\n\n❌ NISO “Open Research Objects (ORO)”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Stored in a permanent archive that is publicly and openly accessible\n❌ Has a persistent identifier\n✅ Includes an open license\n\n\n\n\n\n\n\n\n\n\n\n\n❌ NISO “Open Research Objects - All (ORO-A)”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Stored in a permanent archive that is publicly and openly accessible\n❌ Has a persistent identifier\n✅ Includes an open license\n❌ Complete set of materials shared (as would be needed to fully reproduce article)\n\n\n\n\n\n\n\n\n\n\n\n\n❌ ACM “Artifacts Available”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Stored in a permanent archive that is publicly and openly accessible\n❌ Has a persistent identifier\n\n\n\n\n\n\n\n\n\n\n\n\n❌ COS “Open Code”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Stored in a permanent archive that is publicly and openly accessible\n❌ Has a persistent identifier\n✅ Includes an open license\n❌ Complete set of materials shared (as would be needed to fully reproduce article)\n❌ Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)\n\n\n\n\n\n\n\n\n\n\n\n\n❌ IEEE “Code Available”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Complete set of materials shared (as would be needed to fully reproduce article)\n\n\n\n\n\n\n“Object review” badges\nThese badges relate to the research artefacts being reviewed against criteria of the badge issuer.\n\n\n\n\n\n\n\n\n❌ ACM “Artifacts Evaluated - Functional”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)\n✅ Artefacts are relevant to and contribute to the article’s results\n❌ Complete set of materials shared (as would be needed to fully reproduce article)\n✅ Scripts can be successfully executed\n\n\n\n\n\n\n\n\n\n\n\n\n❌ ACM “Artifacts Evaluated - Reusable”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Artefacts are sufficiently documented (i.e. to understand how it works, to enable it to be run, including package versions)\n❌ Artefacts are carefully documented (more than sufficient - i.e. to the extent that reuse and repurposing is facilitated - e.g. changing parameters, reusing for own purpose)\n✅ Artefacts are relevant to and contribute to the article’s results\n❌ Complete set of materials shared (as would be needed to fully reproduce article)\n✅ Scripts can be successfully executed\n❌ Artefacts are well structured/organised (e.g. to the extent that reuse and repurposing is facilitated, adhering to norms and standards of research community)\n\n\n\n\n\n\n\n\n\n\n\n\n❌ IEEE “Code Reviewed”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Complete set of materials shared (as would be needed to fully reproduce article)\n✅ Scripts can be successfully executed\n\n\n\n\n\n\n“Reproduced” badges\nThese badges relate to an independent party regenerating the reuslts of the article using the author objects.\n\n\n\n\n\n\n\n\n❌ NISO “Results Reproduced (ROR-R)”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Independent party regenerated results using the authors research artefacts\n\n\n\n\n\n\n\n\n\n\n\n\n❌ ACM “Results Reproduced”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Independent party regenerated results using the authors research artefacts\n\n\n\n\n\n\n\n\n\n\n\n\n❌ IEEE “Code Reproducible”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Independent party regenerated results using the authors research artefacts\n\n\n\n\n\n\n\n\n\n\n\n\n❌ Psychological Science “Computational Reproducibility”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Independent party regenerated results using the authors research artefacts\n❌ Reproduced within approximately one hour (excluding compute time)\n❌ Artefacts are well structured/organised (e.g. to the extent that reuse and repurposing is facilitated, adhering to norms and standards of research community)\n❌ Artefacts are clearly documented and accompanied by a README file with step-by-step instructions on how to reproduce results in the manuscript" + "text": "Badges\n\n\nCode\n# Full badge names\nbadge_names = {\n # Open objects\n 'open_acm': 'ACM \"Artifacts Available\"',\n 'open_niso': 'NISO \"Open Research Objects (ORO)\"',\n 'open_niso_all': 'NISO \"Open Research Objects - All (ORO-A)\"',\n 'open_cos': 'COS \"Open Code\"',\n 'open_ieee': 'IEEE \"Code Available\"',\n # Object review\n 'review_acm_functional': 'ACM \"Artifacts Evaluated - Functional\"',\n 'review_acm_reusable': 'ACM \"Artifacts Evaluated - Reusable\"',\n 'review_ieee': 'IEEE \"Code Reviewed\"',\n # Results reproduced\n 'reproduce_acm': 'ACM \"Results Reproduced\"',\n 'reproduce_niso': 'NISO \"Results Reproduced (ROR-R)\"',\n 'reproduce_ieee': 'IEEE \"Code Reproducible\"',\n 'reproduce_psy': 'Psychological Science \"Computational Reproducibility\"'\n}\n\n# Criteria required by each badge\nbadges = {\n # Open objects\n 'open_acm': ['archive'],\n 'open_niso': ['archive', 'licence'],\n 'open_niso_all': ['archive', 'licence', 'complete'],\n 'open_cos': ['archive', 'licence', 'docs1'],\n 'open_ieee': ['complete'],\n # Object review\n 'review_acm_functional': ['docs2', 'relevant', 'complete', 'execute'],\n 'review_acm_reusable': ['docs2', 'relevant', 'complete', 'execute', 'careful'],\n 'review_ieee': ['complete', 'execute'],\n # Results reproduced\n 'reproduce_acm': ['reproduce'],\n 'reproduce_niso': ['reproduce'],\n 'reproduce_ieee': ['reproduce'],\n 'reproduce_psy': ['reproduce', 'readme', 'dependencies', 'correspond']\n}\n\n# Identify which badges would be awarded based on criteria\n# Get list of badges met (True/False) overall\naward = {}\nfor badge in badges:\n award[badge] = all([eval[key] == 1 for key in badges[badge]])\naward_list = list(award.values())\n\n# Write introduction\n# Get list of badges met (True/False) by category\naward_open = [v for k,v in award.items() if k.startswith('open_')]\naward_review = [v for k,v in award.items() if k.startswith('review_')]\naward_reproduce = [v for k,v in award.items() if k.startswith('reproduce_')]\n\n# Create and display text for introduction\ndisplay(Markdown(f'''\nIn total, the original study met the criteria for **{sum(award_list)} of the {len(award_list)} badges**. This included:\n\n* **{sum(award_open)} of the {len(award_open)}** “open objects” badges\n* **{sum(award_review)} of the {len(award_review)}** “object review” badges\n* **{sum(award_reproduce)} of the {len(award_reproduce)}** “reproduced” badges\n'''))\n\n# Make function that creates collapsible callouts for each badge\ndef create_badge_callout(award_dict):\n '''\n Displays Markdown callouts created for each badge in the dictionary, showing\n whether the criteria for that badge was met.\n\n Parameters:\n -----------\n award_dict : dict\n Dictionary where key is badge (as variable name), and value is Boolean\n (whether badge is awarded)\n '''\n callout_appearance = {True: 'tip',\n False: 'warning'}\n callout_icon = {True: '✅',\n False: '❌'}\n callout_text = {True: 'Meets all criteria:',\n False: 'Does not meet all criteria:'}\n\n for key, value in award_dict.items():\n # Create Markdown list with...\n criteria_list = ''.join([\n '* ' +\n callout_icon[eval[k]] + # Icon based on whether it met criteria\n ' ' +\n criteria[k] + # Full text description of criteria\n '\\n' for k in badges[key]])\n # Create the callout and display it\n display(Markdown(f'''\n::: {{.callout-{callout_appearance[value]} appearance=\"minimal\" collapse=true}}\n\n## {callout_icon[value]} {badge_names[key]}\n\n{callout_text[value]}\n\n{criteria_list}\n:::\n'''))\n\n# Create badge functions with introductions and callouts\ndisplay(Markdown('''\n### \"Open objects\" badges\n\nThese badges relate to research artefacts being made openly available.\n'''))\ncreate_badge_callout({k: v for (k, v) in award.items() if k.startswith('open_')})\n\ndisplay(Markdown('''\n### \"Object review\" badges\n\nThese badges relate to the research artefacts being reviewed against criteria of the badge issuer.\n'''))\ncreate_badge_callout({k: v for (k, v) in award.items() if k.startswith('review_')})\n\ndisplay(Markdown('''\n### \"Reproduced\" badges\n\nThese badges relate to an independent party regenerating the reuslts of the article using the author objects.\n'''))\ncreate_badge_callout({k: v for (k, v) in award.items() if k.startswith('reproduce_')})\n\n\nIn total, the original study met the criteria for 0 of the 12 badges. This included:\n\n0 of the 5 “open objects” badges\n0 of the 3 “object review” badges\n0 of the 4 “reproduced” badges\n\n\n\n“Open objects” badges\nThese badges relate to research artefacts being made openly available.\n\n\n\n\n\n\n\n\n❌ ACM “Artifacts Available”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)\n\n\n\n\n\n\n\n\n\n\n\n\n❌ NISO “Open Research Objects (ORO)”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)\n✅ Open licence\n\n\n\n\n\n\n\n\n\n\n\n\n❌ NISO “Open Research Objects - All (ORO-A)”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)\n✅ Open licence\n❌ Complete (all relevant artefacts available)\n\n\n\n\n\n\n\n\n\n\n\n\n❌ COS “Open Code”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Artefacts are archived in a repository that is: (a) public (b) guarantees persistence (c) gives a unique identifier (e.g. DOI)\n✅ Open licence\n❌ Documents (a) how code is used (b) how it relates to article (c) software, systems, packages and versions\n\n\n\n\n\n\n\n\n\n\n\n\n❌ IEEE “Code Available”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Complete (all relevant artefacts available)\n\n\n\n\n\n\n“Object review” badges\nThese badges relate to the research artefacts being reviewed against criteria of the badge issuer.\n\n\n\n\n\n\n\n\n❌ ACM “Artifacts Evaluated - Functional”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Documents (a) inventory of artefacts (b) sufficient description for artefacts to be exercised\n✅ Artefacts relevant to paper\n❌ Complete (all relevant artefacts available)\n✅ Scripts can be successfully executed\n\n\n\n\n\n\n\n\n\n\n\n\n❌ ACM “Artifacts Evaluated - Reusable”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Documents (a) inventory of artefacts (b) sufficient description for artefacts to be exercised\n✅ Artefacts relevant to paper\n❌ Complete (all relevant artefacts available)\n✅ Scripts can be successfully executed\n❌ Artefacts are carefully documented and well-structured to the extent that reuse and repurposing is facilitated, adhering to norms and standards\n\n\n\n\n\n\n\n\n\n\n\n\n❌ IEEE “Code Reviewed”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Complete (all relevant artefacts available)\n✅ Scripts can be successfully executed\n\n\n\n\n\n\n“Reproduced” badges\nThese badges relate to an independent party regenerating the reuslts of the article using the author objects.\n\n\n\n\n\n\n\n\n❌ ACM “Results Reproduced”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)\n\n\n\n\n\n\n\n\n\n\n\n\n❌ NISO “Results Reproduced (ROR-R)”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)\n\n\n\n\n\n\n\n\n\n\n\n\n❌ IEEE “Code Reproducible”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)\n\n\n\n\n\n\n\n\n\n\n\n\n❌ Psychological Science “Computational Reproducibility”\n\n\n\n\n\nDoes not meet all criteria:\n\n❌ Reproduced results (assuming (a) acceptably similar (b) reasonable time frame (c) only minor troubleshooting)\n❌ README file with step-by-step instructions to run analysis\n❌ Dependencies (e.g. package versions) stated\n❌ Clear how output of analysis corresponds to article" }, { "objectID": "evaluation/badges.html#sources", "href": "evaluation/badges.html#sources", "title": "Journal badges", "section": "Sources", - "text": "Sources\nNational Information Standards Organisation (NISO) (NISO Reproducibility Badging and Definitions Working Group (2021))\n\n“Open Research Objects (ORO)”\n“Open Research Objects - All (ORO-A)”\n“Results Reproduced (ROR-R)”\n\nAssociation for Computing Machinery (ACM) (Association for Computing Machinery (ACM) (2020))\n\n“Artifacts Available”\n“Artifacts Evaluated - Functional”\n“Artifacts Evaluated - Resuable”\n“Results Reproduced”\n\nCenter for Open Science (COS) (Blohowiak et al. (2023))\n\n“Open Code”\n\nInstitute of Electrical and Electronics Engineers (IEEE) (Institute of Electrical and Electronics Engineers (IEEE) (n.d.))\n\n“Code Available”\n“Code Reviewed”\n“Code Reproducible”\n\nPsychological Science (Hardwicke and Vazire (2023) and Association for Psychological Science (APS) (2023))\n\n“Computational Reproducibility”" + "text": "Sources\nNational Information Standards Organisation (NISO) (NISO Reproducibility Badging and Definitions Working Group (2021))\n\n“Open Research Objects (ORO)”\n“Open Research Objects - All (ORO-A)”\n“Results Reproduced (ROR-R)”\n\nAssociation for Computing Machinery (ACM) (Association for Computing Machinery (ACM) (2020))\n\n“Artifacts Available”\n“Artifacts Evaluated - Functional”\n“Artifacts Evaluated - Resuable”\n“Results Reproduced”\n\nCenter for Open Science (COS) (Blohowiak et al. (2023))\n\n“Open Code”\n\nInstitute of Electrical and Electronics Engineers (IEEE) (Institute of Electrical and Electronics Engineers (IEEE) (2024))\n\n“Code Available”\n“Code Reviewed”\n“Code Reproducible”\n\nPsychological Science (Hardwicke and Vazire (2024) and Association for Psychological Science (APS) (2024))\n\n“Computational Reproducibility”" }, { "objectID": "evaluation/reporting.html", @@ -445,7 +487,7 @@ "href": "evaluation/reporting.html#stress-des", "title": "Reporting guidelines", "section": "STRESS-DES", - "text": "STRESS-DES\nOf the 24 items in the checklist:\n\n14 were met fully (✅)\n6 were partially met (🟡)\n3 were not met (❌)\n1 was not applicable (N/A)\n\n\n\n\n\n\n\n\n\n\nItem\nRecommendation\nMet by study?\nEvidence\n\n\n\n\nObjectives\n\n\n\n\n\n1.1 Purpose of the model\nExplain the background and objectives for the model\n✅ Fully\nIntroduction: “Endovascular clot retrieval (ECR) is the first-line treatment for acute ischemic stroke (AIS) due to arterial large vessel occlusion (LVO) with several trials demonstrating its efficacy in reducing mortality and morbidity (1–3). However, ECR is considerably more costly than traditional care (4), with estimated procedure costs ranging between 9,000 and 14,000 US dollars per patient (4, 5). Major expenditure is required for capital equipment such as angiography equipment purchase and maintenance. Staffing must be adequate to deliver a 24/7 rapid response service. Government funding agencies seek to optimize return on investment, such as that on resources allocated to acute stroke services. In contrast to other healthcare fields, a resource-use optimization model has not been implemented for comprehensive stroke services.”Huang et al. (2019)\n\n\n1.2 Model outputs\nDefine all quantitative performance measures that are reported, using equations where necessary. Specify how and when they are calculated during the model run along with how any measures of error such as confidence intervals are calculated.\n✅ Fully\nOutcome Measures: “We examined two outcome measures in this model: the patient wait time and resource utilization rate. “Patient wait time” is the time spent queuing for a resource. “Resource utilization rate” represents the median occupancy rate.”Statistics and software: “To facilitate graphical and descriptive comparison across models, we express waiting times as relative probabilities of waiting a given amount of time, compared to not waiting at all.”Huang et al. (2019)\n\n\n1.3 Experimentation aims\nIf the model has been used for experimentation, state the objectives that it was used to investigate.(A) Scenario based analysis – Provide a name and description for each scenario, providing a rationale for the choice of scenarios and ensure that item 2.3 (below) is completed.(B) Design of experiments – Provide details of the overall design of the experiments with reference to performance measures and their parameters (provide further details in data below).(C) Simulation Optimisation – (if appropriate) Provide full details of what is to be optimised, the parameters that were included and the algorithm(s) that was be used. Where possible provide a citation of the algorithm(s).\n✅ Fully\nAll scenarios are described and justified.Results: “To investigate why a bottleneck exists at angioINR, we tested three scenarios with varying degrees of patient accessibility to angioINR. First, in the “exclusive-use” scenario, angioINR is not available for elective IR patients. Its use is restricted to stroke, elective INR and emergency IR patients. Second, in the “two angioINRs” scenario, the angioIR is replaced with an angioINR, doubling angiography availability for ECR patients. Lastly, in the “extended schedule” scenario, day time working hours of all human resources are extended by up to 2 h, extending resource access to all patients.”Results: Using DES to Predict Future Resource Usage: “Since acquiring data for this study, the demands for ECR at our Comprehensive Stroke Service has doubled between 2018 and 19 and is predicted to triple by the end of 2019. We simulated these increased demands on the resource.”Huang et al. (2019)\n\n\nLogic\n\n\n\n\n\n2.1 Base model overview diagram\nDescribe the base model using appropriate diagrams and description. This could include one or more process flow, activity cycle or equivalent diagrams sufficient to describe the model to readers. Avoid complicated diagrams in the main text. The goal is to describe the breadth and depth of the model with respect to the system being studied.\n✅ Fully\nFigure 1:Huang et al. (2019)\n\n\n2.2 Base model logic\nGive details of the base model logic. Give additional model logic details sufficient to communicate to the reader how the model works.\n✅ Fully\nDetailed in Methods: Model Algorithm\n\n\n2.3 Scenario logic\nGive details of the logical difference between the base case model and scenarios (if any). This could be incorporated as text or where differences are substantial could be incorporated in the same manner as 2.2.\n✅ Fully\nAs in 1.3.\n\n\n2.4 Algorithms\nProvide further detail on any algorithms in the model that (for example) mimic complex or manual processes in the real world (i.e. scheduling of arrivals/ appointments/ operations/ maintenance, operation of a conveyor system, machine breakdowns, etc.). Sufficient detail should be included (or referred to in other published work) for the algorithms to be reproducible. Pseudo-code may be used to describe an algorithm.\n🟡 Partially\nMethods: Model Properties: Patients: “Patients are generated by a Poissone process with an inter-arrival time as specified in Table 1.”Huang et al. (2019) Doesn’t describe some of the other processes from the code (e.g. sampling appointment length, or intricacies of how the suspected stroke / AIS / ECR are not directly inter-arrival time but instead probability based).\n\n\n2.5.1 Components - entities\nGive details of all entities within the simulation including a description of their role in the model and a description of all their attributes.\n✅ Fully\nDescribes all four patient types in Methods: Model Algorithm - “(1) a stroke pathway, (2) an elective non-stroke interventional neuroradiology (elective INR) pathway, (3) an emergency interventional radiology (emergency IR) pathway and (4) an elective interventional radiology (elective IR) pathway.”Huang et al. (2019)\n\n\n2.5.2 Components - activities\nDescribe the activities that entities engage in within the model. Provide details of entity routing into and out of the activity.\n✅ Fully\nDescribed in Methods: Model Algorithm and visualised in Figure 1.Huang et al. (2019)\n\n\n2.5.3 Components - resources\nList all the resources included within the model and which activities make use of them.\n✅ Fully\nMethods: “resources represent human and physical resources such as interventional radiologist (IR), interventional neuroradiologist (INR), stroke physician, nurse, radiology technologist, CT scanner, single plane (angioIR), and biplane (angioINR) angiography suites.”Used described in Methods: Model Algorithm and visualised in Figure 1.Huang et al. (2019)\n\n\n2.5.4 Components - queues\nGive details of the assumed queuing discipline used in the model (e.g. First in First Out, Last in First Out, prioritisation, etc.). Where one or more queues have a different discipline from the rest, provide a list of queues, indicating the queuing discipline used for each. If reneging, balking or jockeying occur, etc., provide details of the rules. Detail any delays or capacity constraints on the queues.\n✅ Fully\nMethods: Model Properties: Queueing: “In the real world, resources are preferentially given to emergency patients over elective or non-emergency patients. In our model, emergency IR and stroke patients have higher priority than elective patients for resources. Specifically, angioINRs are capable of both INR and IR procedures, although all patient types can utilize this resource, stroke patients have priority compared to other patient types. Emergency IR patients are next in line, followed by elective patients. For example, if a stroke patient and an emergency IR patient enter a queue with 10 elective patients for angioINR, the stroke patient will automatically be placed in front of the queue followed by the emergency IR patient. For an angiography machine for IR procedures only (angioIR), emergency IR patients have priority over elective IR patients. When no resources are available, but multiple resource choices are present, a patient automatically enters the resource queue with the least number of entities (i.e., the shortest queue).”Huang et al. (2019)\n\n\n2.5.5 Components - entry/exit points\nGive details of the model boundaries i.e. all arrival and exit points of entities. Detail the arrival mechanism (e.g. ‘thinning’ to mimic a non-homogenous Poisson process or balking)\n✅ Fully\nEasily understood from Figure 1.Huang et al. (2019)\n\n\nData\n\n\n\n\n\n3.1 Data sources\nList and detail all data sources. Sources may include:• Interviews with stakeholders,• Samples of routinely collected data,• Prospectively collected samples for the purpose of the simulation study,• Public domain data published in either academic or organisational literature. Provide, where possible, the link and DOI to the data or reference to published literature.All data source descriptions should include details of the sample size, sample date ranges and use within the study.\n✅ Fully\nMethods: Model Algorithm: “The decision to proceed to the next event is probabilistic and is acquired from logged data from a Comprehensive Stroke Service in Melbourne, Australia, between 2016 and 17”Model Properties: Patients: “Inter-arrival times are calculated from patient statistics which were obtained from logged data from a Comprehensive Stroke Service in Melbourne, Australia between 2016 and 17.”Huang et al. (2019)\n\n\n3.2 Pre-processing\nProvide details of any data manipulation that has taken place before its use in the simulation, e.g. interpolation to account for missing data or the removal of outliers.\nN/A\nNone provided, so presumed not applicable.\n\n\n3.3 Input parameters\nList all input variables in the model. Provide a description of their use and include parameter values. For stochastic inputs provide details of any continuous, discrete or empirical distributions used along with all associated parameters. Give details of all time dependent parameters and correlation.Clearly state:• Base case data• Data use in experimentation, where different from the base case.• Where optimisation or design of experiments has been used, state the range of values that parameters can take.• Where theoretical distributions are used, state how these were selected and prioritised above other candidate distributions.\n🟡 Partially\nMany are provided in Table 1, although some parameters are not described (e.g. length of time with resources)Huang et al. (2019)\n\n\n3.4 Assumptions\nWhere data or knowledge of the real system is unavailable what assumptions are included in the model? This might include parameter values, distributions or routing logic within the model.\n❌ Not met\nCannot identify in paper.\n\n\nExperimentation\n\n\n\n\n\n4.1 Initialisation\nReport if the system modelled is terminating or non-terminating. State if a warm-up period has been used, its length and the analysis method used to select it. For terminating systems state the stopping condition.State what if any initial model conditions have been included, e.g., pre-loaded queues and activities. Report whether initialisation of these variables is deterministic or stochastic.\n❌ Not met\nNot described.\n\n\n4.2 Run length\nDetail the run length of the simulation model and time units.\n✅ Fully\nMethods: Statistics and Software: “Each scenario has a runtime of 365 days”Huang et al. (2019)\n\n\n4.3 Estimation approach\nState the method used to account for the stochasticity: For example, two common methods are multiple replications or batch means. Where multiple replications have been used, state the number of replications and for batch means, indicate the batch length and whether the batch means procedure is standard, spaced or overlapping. For both procedures provide a justification for the methods used and the number of replications/size of batches.\n🟡 Partially\nNumber of replications stated but not justified.Methods: Statistics and Software: “Each scenario… was simulated 30 times”Huang et al. (2019)\n\n\nImplementation\n\n\n\n\n\n5.1 Software or programming language\nState the operating system and version and build number.State the name, version and build number of commercial or open source DES software that the model is implemented in.State the name and version of general-purpose programming languages used (e.g. Python 3.5).Where frameworks and libraries have been used provide all details including version numbers.\n🟡 Partially\nSome details provided - Methods: Statistics and Software: “The DES model was built with Simmer (version 4.1.0), a DES package for R. The interactive web application was built with R-Shiny”Huang et al. (2019)\n\n\n5.2 Random sampling\nState the algorithm used to generate random samples in the software/programming language used e.g. Mersenne Twister.If common random numbers are used, state how seeds (or random number streams) are distributed among sampling processes.\n🟡 Partially\nSampling described for arrivals but not for length of time with resources. Doesn’t mention whether seeds are used.Methods: Model Properties: Patients: “Patients are generated by a Poissone process with an inter-arrival time as specified in Table 1.”Huang et al. (2019)\n\n\n5.3 Model execution\nState the event processing mechanism used e.g. three phase, event, activity, process interaction.Note that in some commercial software the event processing mechanism may not be published. In these cases authors should adhere to item 5.1 software recommendations.State all priority rules included if entities/activities compete for resources.If the model is parallel, distributed and/or use grid or cloud computing, etc., state and preferably reference the technology used. For parallel and distributed simulations the time management algorithms used. If the HLA is used then state the version of the standard, which run-time infrastructure (and version), and any supporting documents (FOMs, etc.)\n🟡 Partially\nDoes not state event processing mechanism. Does describe priority rules - Methods: Model Properties: Queueing - e.g. “n our model, emergency IR and stroke patients have higher priority than elective patients for resources. Specifically, angioINRs are capable of both INR and IR procedures, although all patient types…\n\n\n5.4 System specification\nState the model run time and specification of hardware used. This is particularly important for large scale models that require substantial computing power. For parallel, distributed and/or use grid or cloud computing, etc. state the details of all systems used in the implementation (processors, network, etc.)\n❌ Not met\n-\n\n\nCode access\n\n\n\n\n\n6.1 Computer model sharing statement\nDescribe how someone could obtain the model described in the paper, the simulation software and any other associated software (or hardware) needed to reproduce the results. Provide, where possible, the link and DOIs to these.\n✅ Fully\nMethods: “The source code for the model is available at https://github.com/shiweih/desECR under a GNU General Public License.”Methods: Statistics and Software: “DES model was built with Simmer (version 4.1.0), a DES package for R. The interactive web application was built with R-Shiny”Discussion: “The model is currently available online at https://rebrand.ly/desECR11” Huang et al. (2019)" + "text": "STRESS-DES\nOf the 24 items in the checklist:\n\n14 were met fully (✅)\n5 were partially met (🟡)\n4 were not met (❌)\n1 was not applicable (N/A)\n\n\n\n\n\n\n\n\n\n\nItem\nRecommendation\nMet by study?\nEvidence\n\n\n\n\nObjectives\n\n\n\n\n\n1.1 Purpose of the model\nExplain the background and objectives for the model\n✅ Fully\nIntroduction: “Endovascular clot retrieval (ECR) is the first-line treatment for acute ischemic stroke (AIS) due to arterial large vessel occlusion (LVO) with several trials demonstrating its efficacy in reducing mortality and morbidity (1–3). However, ECR is considerably more costly than traditional care (4), with estimated procedure costs ranging between 9,000 and 14,000 US dollars per patient (4, 5). Major expenditure is required for capital equipment such as angiography equipment purchase and maintenance. Staffing must be adequate to deliver a 24/7 rapid response service. Government funding agencies seek to optimize return on investment, such as that on resources allocated to acute stroke services. In contrast to other healthcare fields, a resource-use optimization model has not been implemented for comprehensive stroke services.”Huang et al. (2019)\n\n\n1.2 Model outputs\nDefine all quantitative performance measures that are reported, using equations where necessary. Specify how and when they are calculated during the model run along with how any measures of error such as confidence intervals are calculated.\n✅ Fully\nOutcome Measures: “We examined two outcome measures in this model: the patient wait time and resource utilization rate. “Patient wait time” is the time spent queuing for a resource. “Resource utilization rate” represents the median occupancy rate.”Statistics and software: “To facilitate graphical and descriptive comparison across models, we express waiting times as relative probabilities of waiting a given amount of time, compared to not waiting at all.”Huang et al. (2019)\n\n\n1.3 Experimentation aims\nIf the model has been used for experimentation, state the objectives that it was used to investigate.(A) Scenario based analysis – Provide a name and description for each scenario, providing a rationale for the choice of scenarios and ensure that item 2.3 (below) is completed.(B) Design of experiments – Provide details of the overall design of the experiments with reference to performance measures and their parameters (provide further details in data below).(C) Simulation Optimisation – (if appropriate) Provide full details of what is to be optimised, the parameters that were included and the algorithm(s) that was be used. Where possible provide a citation of the algorithm(s).\n✅ Fully\nAll scenarios are described and justified.Results: “To investigate why a bottleneck exists at angioINR, we tested three scenarios with varying degrees of patient accessibility to angioINR. First, in the “exclusive-use” scenario, angioINR is not available for elective IR patients. Its use is restricted to stroke, elective INR and emergency IR patients. Second, in the “two angioINRs” scenario, the angioIR is replaced with an angioINR, doubling angiography availability for ECR patients. Lastly, in the “extended schedule” scenario, day time working hours of all human resources are extended by up to 2 h, extending resource access to all patients.”Results: Using DES to Predict Future Resource Usage: “Since acquiring data for this study, the demands for ECR at our Comprehensive Stroke Service has doubled between 2018 and 19 and is predicted to triple by the end of 2019. We simulated these increased demands on the resource.”Huang et al. (2019)\n\n\nLogic\n\n\n\n\n\n2.1 Base model overview diagram\nDescribe the base model using appropriate diagrams and description. This could include one or more process flow, activity cycle or equivalent diagrams sufficient to describe the model to readers. Avoid complicated diagrams in the main text. The goal is to describe the breadth and depth of the model with respect to the system being studied.\n✅ Fully\nFigure 1:Huang et al. (2019)\n\n\n2.2 Base model logic\nGive details of the base model logic. Give additional model logic details sufficient to communicate to the reader how the model works.\n✅ Fully\nDetailed in Methods: Model Algorithm\n\n\n2.3 Scenario logic\nGive details of the logical difference between the base case model and scenarios (if any). This could be incorporated as text or where differences are substantial could be incorporated in the same manner as 2.2.\n✅ Fully\nAs in 1.3.\n\n\n2.4 Algorithms\nProvide further detail on any algorithms in the model that (for example) mimic complex or manual processes in the real world (i.e. scheduling of arrivals/ appointments/ operations/ maintenance, operation of a conveyor system, machine breakdowns, etc.). Sufficient detail should be included (or referred to in other published work) for the algorithms to be reproducible. Pseudo-code may be used to describe an algorithm.\n🟡 Partially\nMethods: Model Properties: Patients: “Patients are generated by a Poissone process with an inter-arrival time as specified in Table 1.”Huang et al. (2019) Doesn’t describe some of the other processes from the code (e.g. sampling appointment length, or intricacies of how the suspected stroke / AIS / ECR are not directly inter-arrival time but instead probability based).\n\n\n2.5.1 Components - entities\nGive details of all entities within the simulation including a description of their role in the model and a description of all their attributes.\n✅ Fully\nDescribes all four patient types in Methods: Model Algorithm - “(1) a stroke pathway, (2) an elective non-stroke interventional neuroradiology (elective INR) pathway, (3) an emergency interventional radiology (emergency IR) pathway and (4) an elective interventional radiology (elective IR) pathway.”Huang et al. (2019)\n\n\n2.5.2 Components - activities\nDescribe the activities that entities engage in within the model. Provide details of entity routing into and out of the activity.\n✅ Fully\nDescribed in Methods: Model Algorithm and visualised in Figure 1.Huang et al. (2019)\n\n\n2.5.3 Components - resources\nList all the resources included within the model and which activities make use of them.\n✅ Fully\nMethods: “resources represent human and physical resources such as interventional radiologist (IR), interventional neuroradiologist (INR), stroke physician, nurse, radiology technologist, CT scanner, single plane (angioIR), and biplane (angioINR) angiography suites.”Used described in Methods: Model Algorithm and visualised in Figure 1.Huang et al. (2019)\n\n\n2.5.4 Components - queues\nGive details of the assumed queuing discipline used in the model (e.g. First in First Out, Last in First Out, prioritisation, etc.). Where one or more queues have a different discipline from the rest, provide a list of queues, indicating the queuing discipline used for each. If reneging, balking or jockeying occur, etc., provide details of the rules. Detail any delays or capacity constraints on the queues.\n✅ Fully\nMethods: Model Properties: Queueing: “In the real world, resources are preferentially given to emergency patients over elective or non-emergency patients. In our model, emergency IR and stroke patients have higher priority than elective patients for resources. Specifically, angioINRs are capable of both INR and IR procedures, although all patient types can utilize this resource, stroke patients have priority compared to other patient types. Emergency IR patients are next in line, followed by elective patients. For example, if a stroke patient and an emergency IR patient enter a queue with 10 elective patients for angioINR, the stroke patient will automatically be placed in front of the queue followed by the emergency IR patient. For an angiography machine for IR procedures only (angioIR), emergency IR patients have priority over elective IR patients. When no resources are available, but multiple resource choices are present, a patient automatically enters the resource queue with the least number of entities (i.e., the shortest queue).”Huang et al. (2019)\n\n\n2.5.5 Components - entry/exit points\nGive details of the model boundaries i.e. all arrival and exit points of entities. Detail the arrival mechanism (e.g. ‘thinning’ to mimic a non-homogenous Poisson process or balking)\n✅ Fully\nEasily understood from Figure 1.Huang et al. (2019)\n\n\nData\n\n\n\n\n\n3.1 Data sources\nList and detail all data sources. Sources may include:• Interviews with stakeholders,• Samples of routinely collected data,• Prospectively collected samples for the purpose of the simulation study,• Public domain data published in either academic or organisational literature. Provide, where possible, the link and DOI to the data or reference to published literature.All data source descriptions should include details of the sample size, sample date ranges and use within the study.\n✅ Fully\nMethods: Model Algorithm: “The decision to proceed to the next event is probabilistic and is acquired from logged data from a Comprehensive Stroke Service in Melbourne, Australia, between 2016 and 17”Model Properties: Patients: “Inter-arrival times are calculated from patient statistics which were obtained from logged data from a Comprehensive Stroke Service in Melbourne, Australia between 2016 and 17.”Huang et al. (2019)\n\n\n3.2 Pre-processing\nProvide details of any data manipulation that has taken place before its use in the simulation, e.g. interpolation to account for missing data or the removal of outliers.\nN/A\nNone provided, so presumed not applicable.\n\n\n3.3 Input parameters\nList all input variables in the model. Provide a description of their use and include parameter values. For stochastic inputs provide details of any continuous, discrete or empirical distributions used along with all associated parameters. Give details of all time dependent parameters and correlation.Clearly state:• Base case data• Data use in experimentation, where different from the base case.• Where optimisation or design of experiments has been used, state the range of values that parameters can take.• Where theoretical distributions are used, state how these were selected and prioritised above other candidate distributions.\n🟡 Partially\nMany are provided in Table 1, although some parameters are not described (e.g. length of time with resources)Huang et al. (2019)\n\n\n3.4 Assumptions\nWhere data or knowledge of the real system is unavailable what assumptions are included in the model? This might include parameter values, distributions or routing logic within the model.\n❌ Not met\nCannot identify in paper.\n\n\nExperimentation\n\n\n\n\n\n4.1 Initialisation\nReport if the system modelled is terminating or non-terminating. State if a warm-up period has been used, its length and the analysis method used to select it. For terminating systems state the stopping condition.State what if any initial model conditions have been included, e.g., pre-loaded queues and activities. Report whether initialisation of these variables is deterministic or stochastic.\n❌ Not met\nNot described.\n\n\n4.2 Run length\nDetail the run length of the simulation model and time units.\n✅ Fully\nMethods: Statistics and Software: “Each scenario has a runtime of 365 days”Huang et al. (2019)\n\n\n4.3 Estimation approach\nState the method used to account for the stochasticity: For example, two common methods are multiple replications or batch means. Where multiple replications have been used, state the number of replications and for batch means, indicate the batch length and whether the batch means procedure is standard, spaced or overlapping. For both procedures provide a justification for the methods used and the number of replications/size of batches.\n🟡 Partially\nNumber of replications stated but not justified.Methods: Statistics and Software: “Each scenario… was simulated 30 times”Huang et al. (2019)\n\n\nImplementation\n\n\n\n\n\n5.1 Software or programming language\nState the operating system and version and build number.State the name, version and build number of commercial or open source DES software that the model is implemented in.State the name and version of general-purpose programming languages used (e.g. Python 3.5).Where frameworks and libraries have been used provide all details including version numbers.\n🟡 Partially\nSome details provided - Methods: Statistics and Software: “The DES model was built with Simmer (version 4.1.0), a DES package for R. The interactive web application was built with R-Shiny”Huang et al. (2019)\n\n\n5.2 Random sampling\nState the algorithm used to generate random samples in the software/programming language used e.g. Mersenne Twister.If common random numbers are used, state how seeds (or random number streams) are distributed among sampling processes.\n❌ Not met\nDoesn’t mention algorithm or whether seeds or streams are used (know from code that it does not though).\n\n\n5.3 Model execution\nState the event processing mechanism used e.g. three phase, event, activity, process interaction.Note that in some commercial software the event processing mechanism may not be published. In these cases authors should adhere to item 5.1 software recommendations.State all priority rules included if entities/activities compete for resources.If the model is parallel, distributed and/or use grid or cloud computing, etc., state and preferably reference the technology used. For parallel and distributed simulations the time management algorithms used. If the HLA is used then state the version of the standard, which run-time infrastructure (and version), and any supporting documents (FOMs, etc.)\n🟡 Partially\nDoes not state event processing mechanism. Does describe priority rules - Methods: Model Properties: Queueing - e.g. “n our model, emergency IR and stroke patients have higher priority than elective patients for resources. Specifically, angioINRs are capable of both INR and IR procedures, although all patient types…\n\n\n5.4 System specification\nState the model run time and specification of hardware used. This is particularly important for large scale models that require substantial computing power. For parallel, distributed and/or use grid or cloud computing, etc. state the details of all systems used in the implementation (processors, network, etc.)\n❌ Not met\n-\n\n\nCode access\n\n\n\n\n\n6.1 Computer model sharing statement\nDescribe how someone could obtain the model described in the paper, the simulation software and any other associated software (or hardware) needed to reproduce the results. Provide, where possible, the link and DOIs to these.\n✅ Fully\nMethods: “The source code for the model is available at https://github.com/shiweih/desECR under a GNU General Public License.”Methods: Statistics and Software: “DES model was built with Simmer (version 4.1.0), a DES package for R. The interactive web application was built with R-Shiny”Discussion: “The model is currently available online at https://rebrand.ly/desECR11” Huang et al. (2019)" }, { "objectID": "evaluation/reporting.html#des-checklist-derived-from-ispor-sdm", @@ -987,137 +1029,123 @@ "text": "Untimed: Research compendium\n\nTests\nHaving re-ran all the scenarios from scratch, I replaced the files in tests/testthat/expected_results/ and then ran testthat::test_dir(\"tests/testthat\").\nis_true(compare) returned error Error inis_true(compare): unused argument (compare) so switched back to expect_equal().\nHowever, these were then all successful! Included instructions to run these tests, run time, and what you might expect to see, to the reproduction README.\n\n\nDocker\n\nTroubleshooting installation of packages when building images\nRan sudo docker build --tag huang2019 . -f ./docker/Dockerfile from reproduction/ (which is where the renv is located). Hit an error:\n15.45 Warning: failed to find source for 'Matrix 1.7-0' in package repositories\n15.45 Warning: error downloading 'https://cloud.r-project.org/src/contrib/Archive/Matrix/Matrix_1.7-0.tar.gz' [cannot open URL 'https://cloud.r-project.org/src/contrib/Archive/Matrix/Matrix_1.7-0.tar.gz']\n15.45 Error: failed to retrieve package 'Matrix@1.7-0'\n\n...\n\nERROR: failed to solve: process \"/bin/sh -c R -e \\\"renv::restore()\\\"\" did not complete successfully: exit code: 1\nI looked to the address, and found that 1.7-0 was indeed not in the Archive, but it is the latest version of the package. It is available at https://cran.r-project.org/src/contrib/Matrix_1.7-0.tar.gz or at https://cloud.r-project.org/src/contrib/Matrix_1.7-0.tar.gz. This was only the second package it tried to install - the first was MASS 7.3-60.2, and that wasn’t the latest version. Looking at other packages, it seems common that the latest version is not on CRAN archive.\nI tried out a bunch of things, but the same issue persisted throughout:\n\nI found a post with the same issue - that renv() only looks in CRAN archive in a Docker image. They suggested renv::restore(repos = c(CRAN = \"https://cloud.r-project.org\")).\n\nI changed the Dockerfie (but used single quotes for URL) and re-ran - RUN R -e \"renv::restore(repos = c(CRAN = 'https://cloud.r-project.org'))\"\nI tried with double quotes as above, but including \\ to escape the inner quotes - RUN R -e \"renv::restore(repos = c(CRAN = \\\"https://cloud.r-project.org\\\"))\"\n\nBased on some online posts, I wondered if this might be to do with system dependencies. Based on this post, I opened a fresh R session (so not in renv) and tried to install getsysreqs although it was not available for my version of R. The RStudio Package Manager (RSPM) was recommended. I also stumbled across containerit which can make a Dockerfile for you and would include the system dependencies. However, I decided first to try the simplest option, which is to just install a fairly standard list of some linux libraries that R packages need, like here.\nBased on this issue, I add ENV RENV_WATCHDOG_ENABLED FALSE to disable the renv watchdog.\n\nBased on Tom’s Dockerfile which is from Peter Solymos, I tried changing the CRAN source RUN R -e \"renv::restore(repos = c(CRAN = \\\"https://packagemanager.rstudio.com/all/__linux__/focal/latest\\\"))\". This resolved the issue, as it was able to download Matrix from CRAN. All packages successfully downloaded, but I then hit an issue installing the packages:\nERROR: this R is version 4.1.1, package 'MASS' requires R >= 4.4.0\ninstall of package 'MASS' failed [error code 1]`.\nI then realised I had accidentally put R 4.1.1, when I meant to put R 4.4.1! I changed this and re-ran. This was successful until attempting to install igraph, at which it hit an error:\nError in dyn.load(file, DLLpath = DLLpath, ...) : \n unable to load shared object '/home/code/renv/staging/2/igraph/libs/igraph.so':\n libglpk.so.40: cannot open shared object file: No such file or directory\nI add libglpk-dev to the list of system dependencies to install then tried again. It did eventually failed again with another similar issue.\nError in dyn.load(file, DLLpath = DLLpath, ...) : \n unable to load shared object '/home/code/renv/staging/2/stringi/libs/stringi.so':\n libicui18n.so.66: cannot open shared object file: No such file or directory\nI briefly tried adding containerit to my renv to try that and see if it was simpler, although decided to pause on that and remove it and keep trying as before, as I kept getting errors and it wasn’t a quick-fix. I removed it from DESCRIPTION then ran renv::clean(), renv::snapshot().\nI add libicu-dev and tried again. This failed with the same error as before.\nLooking at the rocker rstudio image, it runs on ubunutu 22.04. Posit lists system dependencies for ubunutu 22.04 as apt install -y libcairo2-dev libssl-dev make libcurl4-openssl-dev libmysqlclient-dev unixodbc-dev libnode-dev default-jdk libxml2-dev git libfontconfig1-dev libfreetype6-dev libssh2-1-dev zlib1g-dev libglpk-dev libjpeg-dev imagemagick libmagick++-dev gsfonts cmake libpng-dev libtiff-dev python3 libglu1-mesa-dev libgl1-mesa-dev libgdal-dev gdal-bin libgeos-dev libproj-dev libsqlite3-dev libsodium-dev libicu-dev tcl tk tk-dev tk-table libfribidi-dev libharfbuzz-dev libudunits2-dev. I replaced the line in my Dockerfile and tried again. This failed with the same error as before (so returned it to the simpler list).\nI found this issue with the same error, where it appears there is an issue with the stringi binary being built for the wrong Ubunutu since libicui18n.so.66 is for 20.04, although the fix appeared to be that they fixed the bioconductor container, and it wasn’t super clear to me what I should do.\nBased on this example linked from this issue, I tried switching libicu-dev to libicu. However, this returned error Unable to locate package libicu. I then instead tried adding RUN R -e \"install.packages('stringi')\" before renv::restore(). That ran successfully, but hit a new error:\nError in dyn.load(file, DLLpath = DLLpath, ...) : \n unable to load shared object '/home/code/renv/staging/2/openssl/libs/openssl.so':\n libssl.so.1.1: cannot open shared object file: No such file or directory\nlibssl is in the list of system dependencies that were being installed. A quick google shows there are issues related to libssl.so.1.1 on Ubuntu 22.04. I tried doing the simplest solution first - installing it seperately (as that worked for stringi above).\nThe docker image then built successfully!\n\n\nTroubleshooting empty container\nHaving successfully built the image (sudo docker build --tag huang2019 . -f ./docker/Dockerfile), I then tried creating a container. After some trial and error with the command (and using sudo docker rm huang2019_docker to remove and recreate container)), I got to:\n(sleep 2 && xdg-open http://localhost:8888) & sudo docker run -it -p 8888:8787 -e DISABLE_AUTH=true --name huang2019_docker huang2019\nThis opened up RStudio - although there were no files and none of the libraries I had added were listed in the packages (e.g. no simmer)\nI spent quite a while searching for and trying suggestions on this issue, with little success. E.g.\n\nI tried running sudo docker inspect huang2019 but couldn’t spot anything amiss.\nBased on this post, I checked my .dockerignore, which has **/renv/, which should just be preventing upload of renv.\n\nI then tried copying everything into /home/rstudio rather than making a new directory in the Dockerfile and remaking the image. Got error This project does not contain a lockfile, so add path to renv::restore(). This built successfully, so I used the command above to create a container and open RStudio. This successfully included all the files!\n\n\nTroubleshooting renv in the container\nOn opening RStudio, the console now showed a long list of packages that are missing entries in the cache, saying These packages will need to be reinstalled. It then says Project '~/' loaded. [renv 1.0.7] and The following package(s) have broken symlinks into the cache, with the same list of packages again, and Use renv::repair() to try and reinstall these packages..\nRunning renv::repair(), we get the following message:\n# Library cache links ---------------------------------------------\nrenv appears to be unable to access the requested library path:\n- /home/rstudio/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu\nCheck that the 'rstudio' user has read / write access to this directory.\n\nDo you want to proceed? [Y/n]\nI spent a while googling and tried a few things including -\n\nSelecting to proceed, it installs the packages from CRAN.\nI tried making another container without disabling authentication - (sleep 2 && xdg-open http://localhost:8888) & sudo docker run -it -p 8888:8787 -e PASSWORD=password --name huang2019_docker huang2019, then login with username rstudio password password - but had the same issue.\nLooking in the renv/ folder, it appears to only contain the package renv.\nI tried changing the server to 8787:8787 but this made no difference.\nLooking at the installed packages, it appears to not include anything we add (including stringi and openssl, which were installed seperately from the rest).\n\nBased on this issue, it appears that /home/rstudio/ is owned by the user docker rather than by us (the user rstudio).\n\nTried (sleep 2 && xdg-open http://localhost:8787) & sudo docker run --rm -it --user docker -v $(pwd)/home/$USER/foo -e USER=$USER -e USERID=$UID -p 8787:8787 --name huang2019_docker huang2019 but got error docker: Error response from daemon: unable to find user docker: no matching entries in passwd file.\nBased on this issue, tried changing ownership of renv directory when created in Dockerfile using RUN mkdir -p /renv/ && chown -c rstudio /renv/, but the same error message remained\n\nBased on this issue, tried changing user in Dockerfile for the renv::restore(). I realised whilst doing this that, when I’d made the renv folder, I hadn’t set it to /home/rstudio/ like I’d done for the rest of them! This might have been the issue. This produced an error while building the image:\n7.633 # Installing packages --------------------------------------------------------\n7.888 - Installing stringi ... OK [built from source and cached in 1.3m]\n83.54 Error: could not copy / move file '/home/rstudio/Documents/RStudio/PROJECT/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu/stringi' to '/home/rstudio/Documents/RStudio/PROJECT/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu/.renv-backup-7-stringi73f0bb75'\n83.54 move: cannot rename file '/home/rstudio/Documents/RStudio/PROJECT/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu/stringi' to '/home/rstudio/Documents/RStudio/PROJECT/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu/.renv-backup-7-stringi73f0bb75', reason 'Permission denied'\n83.54 copy: source file '/home/rstudio/Documents/RStudio/PROJECT/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu/.renv-copy-7606940ba' does not exist\nI tried temporarily removing the seperate installations of stringi and openssl, to see if renv::restore() would be successful. This was successful - up until stringi, which had the error from before re: libicui18n.so.66.\nI reintroduced the seperate installations, but tried switching install.packages(\"stringi\") to renv::install(\"stringi\"), but this had the issue from above.\nI then tried to make it more similar to the line installing renv, which does work, so did RUN R -e \"install.packages('stringi', repos = c(CRAN = 'https://cloud.r-project.org'))\", but no change.\nI then tried following the structure used to install renv in the aforementioned GitHub issue - so:\n# Set version of packages installed outside the lockfile\nENV RENV_VERSION 'v1.0.7'\nENV STRINGI_VERSION '1.8.4'\nENV OPENSSL_VERSION '2.2.0'\n\n# Install remotes (which we will use to install packages)\nRUN Rscript -e \"install.packages('remotes', repos = c(CRAN = 'https://cloud.r-project.org'))\"\n\n# Install renv from GitHub\nRUN Rscript -e \"remotes::install_github('rstudio/renv@${RENV_VERSION}')\"\n\n# Install stringi seperately due to issue with not detecting libicu\nRUN Rscript -e \"remotes::install_version('stringi', version='${STRINGI_VERSION}')\"\n\n# Install openssl seperately due to issue with not detecting libssl\nRUN Rscript -e \"remotes::install_version('openssl', version='${OPENSSL_VERSION}')\"\nHowever, we now are getting the libicui18n.so.66 issue, so it appears the problem is that I haven’t installed this into the right place for renv to find it, when I installed it seperately.\nI moved the installation to after having copied over the renv files -\n# Copy files (including renv.lock!) into the image\n# Thanks to .dockerignore, should not copy over renv/ (which is very large)\nCOPY . .\n\n# Copy renv auto-loader tools\nRUN mkdir -p renv/library\nCOPY .Rprofile .Rprofile\nCOPY renv/activate.R renv/activate.R\n\nbut we again get the first issue (could not copy / move file…).\n\nI tried moving it around a few different locations in the file to try and figure out what might be right. I also tried adding in an renv::activate()\n\n\n\nFix Quarto GitHub action\nReturned to the broken Quarto render action (which fails to find rmarkdown despite it having been installed with setup-renv). Some ideas:\n\nExample GitHub action for book with Python and R - although a few years old\nExample GitHub action where they installed packages directly\nRStudio tutorial for custom GitHub action workflow" }, { - "objectID": "logbook/posts/2024_07_19/index.html", - "href": "logbook/posts/2024_07_19/index.html", - "title": "Day 12", + "objectID": "logbook/posts/2024_07_22/index.html", + "href": "logbook/posts/2024_07_22/index.html", + "title": "Day 13", "section": "", - "text": "Note\n\n\n\nFinishing up research compendium: final bit of troubleshooting docker, then GHCR." + "text": "Note\n\n\n\nTom’s test run of the model." }, { - "objectID": "logbook/posts/2024_07_19/index.html#untimed-research-compendium", - "href": "logbook/posts/2024_07_19/index.html#untimed-research-compendium", - "title": "Day 12", - "section": "Untimed: Research compendium", - "text": "Untimed: Research compendium\n\nDocker\nResuming where I left off yesterday.\nCurrent challenge is to try and install stringi and openssl into the renv, so the later renv::restore() doesn’t fail.\n\nImportant commands when troubleshooting\nReminder of key commands:\n\nBuild image: sudo docker build --tag huang2019 . -f ./docker/Dockerfile\nDelete image: sudo docker image rm huang2019\nCreate container and open RStudio: (sleep 2 && xdg-open http://localhost:8888) & sudo docker run -it -p 8888:8787 -e DISABLE_AUTH=true --name huang2019_docker huang2019\nDelete container: sudo docker rm huang2019_docker\n\n\n\nUnsuccessful attempts\nI tried variants of:\n\nPermissions (USER root, USER rstudio)\nInstallation instructions (remotes, renv, install.packages).\n\nI seemed to be getting success with:\nRUN R -e \"renv::activate()\"\nUSER root\nRUN R -e \"renv::install('stringi@${STRINGI_VERSION}')\"\nRUN R -e \"renv::install('openssl@${OPENSSL_VERSION}')\"\nUSER rstudio\n#RUN R -e \"remotes::install_version('openssl', version='${OPENSSL_VERSION}')\"\nRUN R -e \"renv::restore(lockfile=\\\"${PROJDIRECTORY}/renv.lock\\\", repos = c(CRAN = \\\"https://packagemanager.rstudio.com/all/__linux__/focal/latest\\\"))\"\nThis installed stringi and openssl into the renv successfully, although I seemed to need to have USER root permissions. For renv::restore(), it installed fine without needing to be USER root, but it then failed when installing stringi, so it appears to not have resolved the issue.\nError in dyn.load(file, DLLpath = DLLpath, ...) : \n unable to load shared object '/tmp/Rtmp8ogTfT/renv-staging-7b6bc3cd/stringi/libs/stringi.so':\n libicui18n.so.66: cannot open shared object file: No such file or directory\nI tried running all the renv installation whilst being the USER root. The image built successfully, but it did not open as an active project, and the renv/ folder only contained renv.\nI tried just running renv::install() (and not specific installs or restore), but this had errors of:\n\nrenv appears to be unable to access the requested library path: /home/rstudio/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu. Check that the 'rstudio' user has read / write access to this directory.\nError: error downloading 'https://cloud.r-project.org/src/contrib/mime_0.12.tar.gz' [cannot open URL 'https://cloud.r-project.org/src/contrib/mime_0.12.tar.gz']\n\n\n\nMinimal example (small .lock and specific files) succeeds\nI tried temporarily replacing my lockfile with a simple one with only my packages markdown and mime, and renv::restore() under user rstudio (similar to the GitHub issue from yesterday).\n\nWhen running renv::restore(), it seemed to install its own copy of renv (and didn’t use the one I’d installed above) - and indeed, I found I could remove that from the Dockerfile with no impact on the outcome\nThe library was successfully installed and accessible when I opened the container!\n\n{\n \"R\": {\n \"Version\": \"4.4.1\",\n \"Repositories\": [\n {\n \"Name\": \"CRAN\",\n \"URL\": \"https://cloud.r-project.org\"\n }\n ]\n },\n \"Packages\": {\n \"markdown\": {\n \"Package\": \"markdown\",\n \"Version\": \"1.13\",\n \"Source\": \"Repository\",\n \"Repository\": \"CRAN\",\n \"Requirements\": [\n \"R\",\n \"commonmark\",\n \"utils\",\n \"xfun\"\n ],\n \"Hash\": \"074efab766a9d6360865ad39512f2a7e\"\n },\n \"markdown\": {\n \"Package\": \"markdown\",\n \"Version\": \"1.13\",\n \"Source\": \"Repository\",\n \"Repository\": \"CRAN\",\n \"Requirements\": [\n \"R\",\n \"commonmark\",\n \"utils\",\n \"xfun\"\n ],\n \"Hash\": \"074efab766a9d6360865ad39512f2a7e\"\n }\n }\n}\nWhen I did that successful run, I’d only copied over a few essential / example files\nCOPY renv.lock renv.lock\nCOPY reproduction.Rproj reproduction.Rproj\nCOPY scripts scripts\nInstead of\nCOPY . .\nHowever, when I switched back to just copying everything, I get issues that it cannot copy and move files and that permission is denied.\nI tried manually specifying everything from the folder (exc. .Rhistory and .Rproj.user)…\nCOPY DESCRIPTION DESCRIPTION\nCOPY docker docker\nCOPY outputs outputs\nCOPY README.md README.md\nCOPY renv.lock renv.lock\nCOPY reproduction.Rproj reproduction.Rproj\nCOPY scripts scripts\nCOPY tests tests\n…And that built fine.\nSo I tried again with COPY . ., but adding .Rhistory and .Rproj.user to the .dockerignore - but this failed like before. Hence, I decided to stick with specifying the files being copied (and regardless, I guess that has the benefit of being specific about what we include). It appears I must be copying over something undesirable when running COPY . . which is causing us issues, although I can’t spot what this might be.\n\n\nTroubleshooting stringi\nI ran renv::snapshot() to restore the lock file back to being complete, and then tried to build the image again. This failed with the libicui18n.so.66 error from before. I reverted the lockfile back to the simple version (so the various test runs are quicker), but adding stringi, getting the same error.\nTried adding install before restore - RUN R -e \"renv::install('stringi')\" (which automatically installs renv for us before running)…. and it was successfull….! The library contained stringi and the other packages from the lockfile.\nSo, I then, again, restored the full lockfile, add an install for openssl, and tried once more.\nThis was successful!\n\n\nGiving read, write and save access to folders\nAll the files are present and can be run, and the renv is active with all the required files. However, if we want to save anything (e.g. modifying qmd, or saving output from model with ggsave), we don’t currently have permissions.\nBased on the docker documentation, I tried using --chown with the COPY statements to specifically give permissions to the user rstudio. I also modified stringi and openssl so they have the specific versions.\nThis worked!\n\n\n\nGitHub Container Registry\nActivated and ran but hit issue on COPY renv/activate.R renv/activate.R. It cannot find the file - although the previous commands with relative file paths all ran without issue.\nERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 70b54bab-f7c4-4333-a94b-def3ee959db6::iqqrpwic0590fua1x3sv0utsd: \"/renv/activate.R\": not found\nChecking on GitHub, the activate.R file is included. However, in my prior example of this (Shoaib et al. 2022), I ran the dockerfile from the main folder rather than the reproduction folder. Hence, I tried updating the Dockerfile so that the file paths are relative to reproduction’s parent, which fixed the issue.\nI then tested downloading the image from GHCR and ran one of the scripts within that, and it all worked fine. Add instructions for this to the README.\n\n\nSummary report\nFilled out the summary report template." + "objectID": "logbook/posts/2024_07_22/index.html#untimed-test-run-by-second-member-of-stars-team", + "href": "logbook/posts/2024_07_22/index.html#untimed-test-run-by-second-member-of-stars-team", + "title": "Day 13", + "section": "Untimed: Test run by second member of STARS team", + "text": "Untimed: Test run by second member of STARS team\nTom attempted to run the model from my reproduction/ folder.\nWas able to run the tests fine, and also ran some of the scripts.\nThe renv install okay - just needed to install some operating system dependencies via apt, but likely as that was the first time he’d used R on that machine.\nThe local build of the docker image worked fine first time. Launched RStudio server and ran testthat without an issue.\nNoted that in both cases RStudio was using 8GB RAM.\nWasn’t able to run it on his virtual machine (by default, that only allocates 4GB RAM, so that would be why)." }, { - "objectID": "logbook/posts/2024_07_09/index.html", - "href": "logbook/posts/2024_07_09/index.html", - "title": "Day 5", + "objectID": "logbook/posts/2024_07_05/index.html", + "href": "logbook/posts/2024_07_05/index.html", + "title": "Day 3", "section": "", - "text": "Note\n\n\n\nWorking on figures 2 + 3 and in-text result 3. Plus (untimed) fixing Quarto book (environment issues). Total time used: 16h 15m (40.6%)." - }, - { - "objectID": "logbook/posts/2024_07_09/index.html#continuing-on-figure-2", - "href": "logbook/posts/2024_07_09/index.html#continuing-on-figure-2", - "title": "Day 5", - "section": "09.04-09.06, 09.14-09.15: Continuing on Figure 2", - "text": "09.04-09.06, 09.14-09.15: Continuing on Figure 2\nI was curious to see how a different seed would impact the appearance of the figures, and so tried changing the seed from 200 to 300. However, it looks fairly similar.\n\n\n\nFigure 2A Example 1\n\n\nAnd with seed 500 too:\n\n\n\nFigure 2A Example 2" - }, - { - "objectID": "logbook/posts/2024_07_09/index.html#untimed-fixing-github-commits-and-action-for-quarto-book", - "href": "logbook/posts/2024_07_09/index.html#untimed-fixing-github-commits-and-action-for-quarto-book", - "title": "Day 5", - "section": "Untimed: Fixing GitHub commits and action for Quarto book", - "text": "Untimed: Fixing GitHub commits and action for Quarto book\nThis is not timed as I feel it is relevant to the Quarto book and not specific to this reproduction, and so reflects an issue I might have ironed out in a test-run, if I had done a second test-run in R (and not just a Python test-run).\nHad commit the produced .csv files without recognising they were too large. Undid commits with git reset HEAD^, and switched reproduction to only save relevant rows and columns, and to save as a compressed .csv.gz file. This required adding R.utils to the environment.\nAlso, modified quarto_publish.yaml to use setup-r-dependencies, but ran into several errors with this. One I could resolve related to having not pushed the renv/ directory. However, one I have struggled to resolve, which was that there is no package called ‘pak’. I’ve tried switching to ubuntu-22.04, as suggested on this issue. Also tried adding pak within the setup action with extra-packages: | any::pak. Still, issue persists.\nI explored using conda to manage the R environment, and whether that might actually be easier, as I’ve had alot of challenges with renv for this book (but also in general, having just defaulted to using the latest packages, due to facing major issues installing older R and packages). Based on this tutorial, I created a requirements.txt file then ran the following:\nconda create -n huang2019\nconda activate huang2019\nconda install -c conda-forge r-base==4.4.1 --file reproduction/requirements.txt\nHowever, this was running into several issues, stating that the packages were not compatabile with the chosen r-base.\nFinally, I tried switching back to setup-renv. However, this took a long time to run but it does run (and supposedly future runs can use that cache so it is quicker). However, just like before, it stalls with an error (despite seeing that the renv installation above definitely included rmarkdown):\n[19/22] reproduction/reproduction.Rmd\nError in loadNamespace(x) : there is no package called ‘rmarkdown’\nCalls: loadNamespace -> withRestarts -> withOneRestart -> doWithOneRestart\nExecution halted\nR installation:\n Version: 4.4.1\n Path: /opt/R/4.4.1/lib/R\n LibPaths:\n - /home/runner/work/_temp/Library\n - /opt/R/4.4.1/lib/R/library\n knitr: (None)\n rmarkdown: (None)\nThe knitr package is not available in this R installation.\nInstall with install.packages(\"knitr\")\nThe rmarkdown package is not available in this R installation.\nInstall with install.packages(\"rmarkdown\")\nERROR: Error\n at renderFiles (file:///opt/quarto/bin/quarto.js:78081:29)\n at eventLoopTick (ext:core/01_core.js:153:7)\n at async renderProject (file:///opt/quarto/bin/quarto.js:78479:25)\n at async renderForPublish (file:///opt/quarto/bin/quarto.js:109334:33)\n at async renderForPublish (file:///opt/quarto/bin/quarto.js:104866:24)\n at async Object.publish1 [as publish] (file:///opt/quarto/bin/quarto.js:105351:26)\n at async publishSite (file:///opt/quarto/bin/quarto.js:109371:38)\n at async publish7 (file:///opt/quarto/bin/quarto.js:109590:61)\n at async doPublish (file:///opt/quarto/bin/quarto.js:109550:13)\n at async publishAction (file:///opt/quarto/bin/quarto.js:109561:9)\nError: Process completed with exit code 1.\nTried adding Rscript{0} as shell for running R code but this was incorrect.\nThen tried switching reproduction.Rmd to reproduction.qmd. Re-running the action, it was very very slow (14 minutes) (so seemingly not using the cache). Moreover, it still hit an error as above.\nI decided a simpler solution might be to not require R in the Quarto build, and to instead ensure that any scripts using R are pre-rendered in some way (similar to how .ipynb files behave). For .ipynb, the default behaviour is that execute: enabled: false, as in the documentation. However, when run, encountered the error as above.\nTried a few options, including to manually install knitr and rmarkdown, although returned issue that 'lib = \"/usr/local/lib/R/site-library\"' is not writable.\nDid consider other options could be to clone and build examples that are set up with a GitHub action - e.g. renv example, nix example. However, for now, have decided to just disable the action and do it manually from the terminal:\n\nquarto render (rebuilds whole site)\nquarto publish (pushes to github pages)" + "text": "Note\n\n\n\nSet-up environment and run model. Total time used: 7h 23m (18.5%)" }, { - "objectID": "logbook/posts/2024_07_09/index.html#returning-to-figure-2", - "href": "logbook/posts/2024_07_09/index.html#returning-to-figure-2", - "title": "Day 5", - "section": "13.34-14.30, 14.39-14.55: Returning to Figure 2", - "text": "13.34-14.30, 14.39-14.55: Returning to Figure 2\nComparing my figures to the original, although it is now more visually similar than it was, there is still a lot of mismatch compared with those graphs. I’m suspicious this could be due to scaling, as currently I am just using the built in geom_density() scaling to 1, rather than explicitly scaling to the number not waiting. I found the R scripts behind this function unclear.\nInstead, I spent some time working out how to scale these manually, ensuring I was definitely dividing each density by the density from wait_time 0, and this confirmed that it matched up with the results from geom_density()’s scaled. As such, it seems the issue is not due to the scaling.\n# Create figure as usual\np <- create_plot(res_base,\n title=\"Baseline\",\n ylab=\"Standardised density of patient in queue\")\n\n# Get data from the plot\nplot_data <- ggplot_build(p)$data[[1]]\n\n# Create dataframe with the densities for when the waitimes are 0\nno_wait <- plot_data %>% filter(x==0) %>% select(colour, density, scaled)\n#print(no_wait)\n\n# Loop through each of the colours (which reflect the resource groups)\nfor (c in no_wait$colour) {\n # Filter the plot data to that resource group, then divide the densities by\n # the density from wait time 0\n d <- plot_data %>%\n filter(colour == c) %>%\n mutate(scaled2 = density / no_wait[no_wait$colour==c, \"density\"]) %>%\n ungroup() %>%\n select(scaled, scaled2)\n\n # Find the number of rows where these values match the scaled values\n n_match <- sum(apply(d, 1, function(x) length(unique(x)) == 1))\n n_total <- nrow(d)\n print(sprintf(\"%s out of %s results match\", n_match, n_total))\n}\nGiven the scaling seems ok, the only other options I can think of are:\n\nThe environment - although I would anticipate that to be more of an issue of a model not running, rather than fundamentally changing results\nThe model parameters - I’ve had another look back over the model code, and tried changing INR night -\n\nModel was set up to have INR staff on a schedule, but in the paper they are 24 hours. I had set this up by having 1 day and 1 night staff, but I’ve tried changing the code so it’s just a single resource (like how ED team and stroke team are set up)\nOtherwise, all parameters look correct compared against Table 1\n\n\nHowever, model results came out the same. I am rather stuck on this now, so will move onto Figure 3 (having first, re-run reproduction with seed=200, as per in-text result 1)." + "objectID": "logbook/posts/2024_07_05/index.html#set-python-interpreter", + "href": "logbook/posts/2024_07_05/index.html#set-python-interpreter", + "title": "Day 3", + "section": "09.46-09.47: Set Python interpreter", + "text": "09.46-09.47: Set Python interpreter\nSet Python interpreter (e.g. to render these from RStudio) by clicking on the project in the top right of RStudio, then selecting Project Options > Python, and selecting the quarto_huang_2019 virtual environment I’d set up." }, { - "objectID": "logbook/posts/2024_07_09/index.html#starting-on-figure-3-and-in-text-result-3", - "href": "logbook/posts/2024_07_09/index.html#starting-on-figure-3-and-in-text-result-3", - "title": "Day 5", - "section": "14.56-15.26, 15.31-16.19, 16.24-16.56: Starting on Figure 3 and in-text result 3", - "text": "14.56-15.26, 15.31-16.19, 16.24-16.56: Starting on Figure 3 and in-text result 3\nFor this scenario analysis, the “day time working hours of all human resources are extended by up to 2h, extending resource access to all patients” (Huang et al. (2019)). Given how the model scheduling is set-up, it is assumed that this means we simply adjust the schedule to end at 5, 6 or 7pm (and that that would simply shortern the night staff time).\nI ran these scenarios, processing and saving the relevant model results.\nFor in-text result 3, I can see that the results do not match up to the paper. I am not surprised by this though - as the model had no seed control, as it is not mentioned in the paper, we can assume that it might not have been used by the original study, and so variation between the scenarios could (in part) reflect model stochasticity.\n\nimport pandas as pd\n\npd.read_csv(\"txt3.csv\")\n\n\n\n\n\n\n\n\n\nscenario\nshift\nmean\ndiff_from_5pm\n\n\n\n\n0\nBaseline\n5pm\n13.958269\n0.00\n\n\n1\nBaseline\n6pm\n12.486042\n-1.47\n\n\n2\nBaseline\n7pm\n12.491421\n-1.47\n\n\n3\nExclusive use\n5pm\n8.117729\n0.00\n\n\n4\nExclusive use\n6pm\n7.802954\n-0.31\n\n\n5\nExclusive use\n7pm\n6.432643\n-1.69\n\n\n6\nTwo AngioINRs\n5pm\n13.511560\n0.00\n\n\n7\nTwo AngioINRs\n6pm\n11.408894\n-2.10\n\n\n8\nTwo AngioINRs\n7pm\n11.256842\n-2.25\n\n\n\n\n\n\n\n\nTo test this assumption, I ran the model again for baseline with two further seeds. We can see the importance of seed control here. For example, with seed 700, we see a broader range of results, with the result for 6pm (13.32) is much higher than for the other two seeds and, compared with their 5pm results, we would’ve seen less of a reduction. Similarly, if we compared the 5pm seed 700 result with the 6pm seed 500 result, we would see a much greater reduction.\n\npd.read_csv(\"txt3_seeds.csv\")\n\n\n\n\n\n\n\n\n\nscenario\n5pm\n6pm\n7pm\n\n\n\n\n0\nBaseline\n13.96\n12.49\n12.49\n\n\n1\nBaseline (seed 500)\n13.96\n12.15\n12.20\n\n\n2\nBaseline (seed 700)\n15.47\n13.32\n12.30\n\n\n\n\n\n\n\n\nFor Figure 3, it was simple to adapt the function to create it but, similar to Figure 2, there are several differences in the original study results.\n\n\n\nFigure 3" + "objectID": "logbook/posts/2024_07_05/index.html#returning-to-troubleshooting-r-version", + "href": "logbook/posts/2024_07_05/index.html#returning-to-troubleshooting-r-version", + "title": "Day 3", + "section": "09.48-10.21: Returning to troubleshooting R version", + "text": "09.48-10.21: Returning to troubleshooting R version\nContinuing to look at the instructions for old R releases from yesterday:\n\n“As of July 2023, packages for R versions below 4.0 are no longer being updated. R 3.6 packages for Ubuntu on i386 and amd64 are available for most stable Desktop releases of Ubuntu until their official end of life date. However, only the latest Long Term Support (LTS) release is fully supported. As of November 18, 2018 the supported releases are Bionic Beaver (18.04;LTS), Xenial Xerus (16.04; LTS), and Trusty Tahr (14.04; LTS).”\n\nBy running lsb_release -a, I can see that my linux version is jammy (22.04.4 LTS). Looking at the instructions from this Stackoverflow post, I’m a bit unclear as to whether I can use any of these if they’re for older versions of linux.\nFrom this help post, I then stumbled across RStudio r-builds which has R builds that say they should install fast on Ubuntu from a .deb file and are designed to easily switch between multiple versions of R. These say they support Ubunutu 22.04. I ran:\nR_VERSION=3.6.0\ncurl -O https://cdn.posit.co/r/ubuntu-2204/pkgs/r-${R_VERSION}_1_amd64.deb\nsudo apt-get install gdebi-core\nsudo gdebi r-${R_VERSION}_1_amd64.deb\nI confirmed this was installed by running /opt/R/${R_VERSION}/bin/R --version.\nI then followed their instructions to add R to the system path:\nsudo ln -s /opt/R/${R_VERSION}/bin/R /usr/local/bin/R \nsudo ln -s /opt/R/${R_VERSION}/bin/Rscript /usr/local/bin/Rscript\nI restarted RStudio and found I was now in R 3.6.0. I delete the renv (which was built with 4.4.1) and remade it.\nrenv::deactivate(clean=TRUE)\ninstall.packages(\"renv\")\nrenv::init(bare=TRUE)\nrenv::snapshot()\nThe lock file now had R 3.6.0 (previously 4.4.1) and renv 1.0.7." }, { - "objectID": "logbook/posts/2024_07_09/index.html#timings", - "href": "logbook/posts/2024_07_09/index.html#timings", - "title": "Day 5", - "section": "Timings", - "text": "Timings\n\nimport sys\nsys.path.append('../')\nfrom timings import calculate_times\n\n# Minutes used prior to today\nused_to_date = 790\n\n# Times from today\ntimes = [\n ('09.04', '09.06'),\n ('09.14', '09.15'),\n ('13.34', '14.30'),\n ('14.39', '14.55'),\n ('14.56', '15.26'),\n ('15.31', '16.19'),\n ('16.24', '16.56')]\n\ncalculate_times(used_to_date, times)\n\nTime spent today: 185m, or 3h 5m\nTotal used to date: 975m, or 16h 15m\nTime remaining: 1425m, or 23h 45m\nUsed 40.6% of 40 hours max" + "objectID": "logbook/posts/2024_07_05/index.html#installing-the-packages", + "href": "logbook/posts/2024_07_05/index.html#installing-the-packages", + "title": "Day 3", + "section": "10.40-11.30, 11.35-11.41: Installing the packages", + "text": "10.40-11.30, 11.35-11.41: Installing the packages\nI ran renv::install() but it failed with: Warning: failed to find source for 'simmer.plot 0.1.15' in package repositories. Error: failed to retrieve package 'simmer.plot@0.1.15'.\nI then tried with remotes:\ninstall.packages(\"remotes\")\nremotes::install_version(\"simmer\", \"4.2.2\")\nHowever, this failed like before. Instead, I decided a different tactic - to just download them without the specified versions. I removed the versions from DESCRIPTION and ran renv::install(). However, this stopped with an error: Error: package 'evaluate' is not available.\nI then tried working through each package one by one.\nrenv::install(\"simmer\") was successful.\nrenv::install(\"simmer.plot\") failed with the issue of ‘evaluate’ is not available. Based on this StackOverflow post, I tried installing ‘stringi’ - but that didn’t end up helping. I tried install evaluate before and after restarting the R session but still stated as not available.\nUncertain on what else might fix this, I decided to actually just start again from the latest version of R and try installing the packages there and see if I could get it to work without backdating the packages. I closed RStudio and ran the commands as above but changed R_VERSION to 4.4.1. I also couldn’t run the commands for symbolic link as it said the files already exist. I restarted R but still 3.6.0. Looking in /opt/R/, I can see I now have 3.6.0 and 4.4.1.\nBased on the prior tutorial I’d found, I tried:\nexport RSTUDIO_WHICH_R=/opt/R/4.4.1/bin/R\nrstudio\nThis worked, although default when open from application bar was still set to 3.6.0. I tried changing the .profile file (nano .profile) to add export RSTUDIO_WHICH_R=/opt/R/4.4.1/bin/R but made no difference.\nI tried forcing replacement of the symbolic links then reopening RStudio:\nR_VERSION=4.4.1\nsudo ln -snf /opt/R/${R_VERSION}/bin/R /usr/local/bin/R \nsudo ln -snf /opt/R/${R_VERSION}/bin/Rscript /usr/local/bin/Rscript\nThis worked! So, trying again (with DESCRIPTION file still containing no versions)…\nrenv::deactivate(clean=TRUE)\ninstall.packages(\"renv\")\nrenv::init(bare=TRUE)\nrenv::snapshot()\nrenv::install()\nrenv::snapshot()" }, { - "objectID": "logbook/posts/2024_07_12/index.html", - "href": "logbook/posts/2024_07_12/index.html", - "title": "Day 8", - "section": "", - "text": "Note\n\n\n\nSupplementary figure then evaluation against guidelines. Reproduction: 24h 10m (60.4%). Evaluation: 1h 31m." + "objectID": "logbook/posts/2024_07_05/index.html#try-running-the-code", + "href": "logbook/posts/2024_07_05/index.html#try-running-the-code", + "title": "Day 3", + "section": "11.41-11.46, 11.52-12.00: Try running the code", + "text": "11.41-11.46, 11.52-12.00: Try running the code\nI copied over server.R and, on opening, it said that plyr and shiny were required but not installed, so I add these to the environment as well.\nOn reflection, I realised that the settings to only store dependencies from DESCRIPTION in renv.lock probably wouldn’t be great, in case hidden things were also installed, so changed this setting to “implicit” (which is default).\nI ran the file and it did the command shiny, but said Error: object 'shiny' not found. I copied over all the files and tried again. It ran the script but nothing happened. Based on the Shiny documentation, I moved the files into a folder called app and run the following in R console:\nlibrary(shiny)\nrunApp(\"app\")\nThis opened up a shiny app, but got an error “there is no package called ‘markdown’”. I add this to the environment and tried again.\nThis ran the app successfully.\nHowever, from having looked at the app online, I knew that the figures it produced are not what I need to reproduce the results presented in the paper." }, { - "objectID": "logbook/posts/2024_07_12/index.html#working-on-the-supplementary-figure", - "href": "logbook/posts/2024_07_12/index.html#working-on-the-supplementary-figure", - "title": "Day 8", - "section": "09.00-09.07, 09.14-09.24, 09.36-09.40: Working on the supplementary figure", - "text": "09.00-09.07, 09.14-09.24, 09.36-09.40: Working on the supplementary figure\nThe supplementary figure consists of doubling and tripling the number of ECR patients.\n\n“Since acquiring data for this study, the demands for ECR at our Comprehensive Stroke Service has doubled between 2018 and 19 and is predicted to triple by the end of 2019. We simulated these increased demands on the resource. As expected, the patient wait times do become longer, but the patterns of resource utilization remained unchanged, suggesting that the same bottlenecks affect throughput” Huang et al. (2019)\n\nI’ve assumed this to mean we double and triple the number of ED arrivals (ed_pt, e.g.ed_pt=107700*2), but the output plots looked vastly different to the paper!\n\n\n\nWrong supplementary figure\n\n\nI then realised I was mistaken, and that perhaps I should have interpreted this as being double and triple the ecr_pt (which is used when model decides whether patient needs ECR: PROB_ECR = ecr_pt / ais_pt). This looked right, and very similar to the paper, with the exception that my angioINR wait times curves peak much lower." + "objectID": "logbook/posts/2024_07_05/index.html#getting-the-raw-model-results", + "href": "logbook/posts/2024_07_05/index.html#getting-the-raw-model-results", + "title": "Day 3", + "section": "12.07-12.21, 13.00-13.21, 13.28-13.41: Getting the raw model results", + "text": "12.07-12.21, 13.00-13.21, 13.28-13.41: Getting the raw model results\nI copied the function simulate_nav from server.R. Looking through it, there was only one part still using shiny - the progress bar - and I removed those lines of code, then add a call for the function at the end of the script (simulate_nav()), and ran it. This ran for a while, which was a little odd given how quick the app was.\nI tried running it with a very short run time (simulate_nav(run_t=60)) and this returned results!\nI borrowed from the plot_nav() function in server.R to help process the results.\nI add the reproduction.Rmd to the Quarto site, but this had issues since the Quarto book renv is seperate to the analysis renv. Based on this forum post, there are two possible solutions:\n\nIntegrate the .html file produced from the .Rmd into the book, so it is pre-rendered, and set the .Rmd to Render on Save.\nAdd the packages needed for the book to the analysis renv.\n\nHowever, it appears you’d have to copy the .html code into the Quarto document. So, decided on the simpler solution of adding the required packages for the book to the analysis environment. I deleted the environment in the main folder." }, { - "objectID": "logbook/posts/2024_07_12/index.html#untimed-consensus-on-reproduction-success", - "href": "logbook/posts/2024_07_12/index.html#untimed-consensus-on-reproduction-success", - "title": "Day 8", - "section": "Untimed: Consensus on reproduction success", - "text": "Untimed: Consensus on reproduction success\nShared with Tom and Alison. Tom and Alison both agreed with decisions (reproduced Figure 5 and in-text 1 and 2, and not other items)." + "objectID": "logbook/posts/2024_07_05/index.html#checking-model-parameters", + "href": "logbook/posts/2024_07_05/index.html#checking-model-parameters", + "title": "Day 3", + "section": "13.42-14.13: Checking model parameters", + "text": "13.42-14.13: Checking model parameters\n\nComparing parameters\nTable 1 provides the parameters for the model. I compared these against the function inputs (as the model have no comments/docstrings, it took a little while to make sure I was matching up the right things).\nPhysical and human resources:\n\n\n\n\n\n\n\n\nParameter\nPaper\nScript\n\n\n\n\nAngiography machine for INR and IR\n1\nangio_inr = 1\n\n\nAngiography machine for IR only\n1\nangio_ir = 1\n\n\nCT\n2\nct = 2\n\n\nInterventional neuroradiologist\n1 24h\ninr = 1 and inr_night = 1\n\n\nInterventional radiologist\n2 8am-5pm 1 5pm-8am\nir = 1 and ir_night = 1\n\n\nAngiography staff\n6 8am-5pm 3 5pm-8am\nangio_staff = 10 and angio_staff_night = 3\n\n\nED team\n10 24h\ned_staff = 10\n\n\nStroke team\n1 24h\nstroke_staff = 1\n\n\n\nFor the shifts parameter: shifts = c(8,17)\nPatients:\n\n\n\nParameter\nPaper N\nPaper IAT\nScript\n\n\n\n\nED\n107,700\n5\ned_pt = 107000\n\n\nSuspected stroke\n750\n701\nst_pt = 750\n\n\nAIS\n450\n1168\nais_pt = 450\n\n\nECR\n58\n9062\necr_pt = 58\n\n\nElective INR\n104\n5054\ninr_pt = 300\n\n\nEmergency IR\n468\n1123\neir_pt= 1000\n\n\nElective IR\n3805\n138\nir_pt = 4000\n\n\n\nI also compared some other parameters mentioned in the paper:\n\nSimulated each scenario 30 times - nsim = 1\nRuntime 365 days - run_t = 10000\n\n\n\nCorrecting differences\n\nInterventional neuroradiologist: inr_night = 0\nInterventional radiologist: ir = 2\nAngiography staff: angio_staff = 6\nED: ed_pt = 107700\nElective INR: inr_pt = 104\nEmergency INR: eir_pt= 468\nElective IR: ir_pt = 3805\nReplications: nsim=30\nRun time…\n\nIn the paper, run time is 365 days\nIn the script, run_t = 10000 and RUN_T = run_t * 40320\nDeduced that time unit is minutes\nThis is set up for the app, where user inputs the run time in months, and 40320 minutes = 28 days\nTo more easily reproduce paper (with run time 365 days), modified script so input is in days (which are then converted to minutes for RUN_T)" }, { - "objectID": "logbook/posts/2024_07_12/index.html#tidy-and-email-author", - "href": "logbook/posts/2024_07_12/index.html#tidy-and-email-author", - "title": "Day 8", - "section": "10.30-10.50: Tidy and email author", - "text": "10.30-10.50: Tidy and email author\nDid a little bit of tidying (e.g. removed some old scenarioes from reproduction.qmd), and then emailed the corresponding author, to let them know the progress with this work, and to ask for any advice re: discrepancies, and whether they might have and be happy to share code that produces these figures." + "objectID": "logbook/posts/2024_07_05/index.html#fixing-environment", + "href": "logbook/posts/2024_07_05/index.html#fixing-environment", + "title": "Day 3", + "section": "14.22-14.27: Fixing environment", + "text": "14.22-14.27: Fixing environment\nThe build of the book on GitHub failed:\nConfiguration failed because libcurl was not found. Try installing:\n * deb: libcurl4-openssl-dev (Debian, Ubuntu, etc)\n * rpm: libcurl-devel (Fedora, CentOS, RHEL)\nIf libcurl is already installed, check that 'pkg-config' is in your\nPATH and PKG_CONFIG_PATH contains a libcurl.pc file. If pkg-config\nis unavailable you can set INCLUDE_DIR and LIB_DIR manually via:\nR CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...'\nBased on this GitHub issue, add installation of this to the action." }, { - "objectID": "logbook/posts/2024_07_12/index.html#timings-for-reproduction", - "href": "logbook/posts/2024_07_12/index.html#timings-for-reproduction", - "title": "Day 8", - "section": "Timings for reproduction", - "text": "Timings for reproduction\n\nimport sys\nsys.path.append('../')\nfrom timings import calculate_times\n\n# Minutes used prior to today\nused_to_date = 1409\n\n# Times from today\ntimes = [\n ('09.00', '09.07'),\n ('09.14', '09.24'),\n ('09.36', '09.40'),\n ('10.30', '10.50')]\n\ncalculate_times(used_to_date, times)\n\nTime spent today: 41m, or 0h 41m\nTotal used to date: 1450m, or 24h 10m\nTime remaining: 950m, or 15h 50m\nUsed 60.4% of 40 hours max" + "objectID": "logbook/posts/2024_07_05/index.html#in-text-results-1-and-2", + "href": "logbook/posts/2024_07_05/index.html#in-text-results-1-and-2", + "title": "Day 3", + "section": "14.29-15.11, 15.32-16.23: In-text results 1 and 2", + "text": "14.29-15.11, 15.32-16.23: In-text results 1 and 2\nThe provided processing scripts may be able to help guide us, but not provided will create the Figures in the paper, so we do need to write that from scratch.\nAlthough the article focuses on the AngioINR, the plot includes 6 resources. The resources are provided by simmer’s get_mon_resources().\nWe’ll start with Figure 2 and its scenarios - with the related in-text results 1 and 2 probbaly being the easiest to initially check.\nThe plot the angio INR wait times, which can be obtained from the arrivals dataframe.\nI created a function that runs the model with the baseline parameters identified above, then looked to the Figure 2 model variants.\n\nExclusive use\nIn this scenario, AngioINR not available to elective IR patients. It is available to stroke, selective INR and emergency IR patients.\nLooking at the model code, use of the angioINR is controlled by a seize(\"angio_inr\", 1) statement in the trajectory() for each patient. Can see that it is seized in:\n\necr_traj (ECR)\nir_traj (Elective IR)\ninr_traj (Elective INR)\neir_traj (Emergency INR)\n\nHence, add an exclusive_use statement and conditional section to remove angio_inr as an option to choose from when the scenario is active for the ir_traj trajectory.\n\n\nTwo angioINRs scenario\nThis was super easy to change with the angio_inr parameter.\n\n\nCheck in-text results 1 and 2\nRan each of the scenarios and found the mean waiting time for each resource across all replications. Results for AngioINR were:\n\nBaseline: 86.99 minutes\nExclusive use: 63.33 minutes\nTwo AngioINR: 52.78 minutes\n\nThis is markedly more than in the paper (exclusive reduces by 6 min, and two angioINRs reduces by 4 min). The median was even more different.\nThis was looking at the waiting time for all patient types though. And the interest of the paper is in stroke (“The elective INR, elective IR and emergency IR pathways are modeled because they utilize resources shared with the stroke pathway.” Huang et al. (2019))\nThe results have 4 categories: ed, ir, eir, and inr. Hence, it appears ED should be stroke - and indeed, in paper, the stroke pathway begins with a new patient in the emergency department (ED). When filtered just to those patients…\nMean wait times are:\n\nBaseline 307.83 minutes\nExclusive: 292.18 minutes\nTwo AngioINR: 319.94 minutes\n\nMedian wait times for the AngioINR are:\n\nBaseline: 206.53 minutes\nExclusive: 199.03 minutes\nTwo AngioINR: 244.27 minutes\n\nBy the median times, we’re fairly close to the paper (comparing the averages, it 7 minutes quicker). However, two angioINR is very different, and I’m a little sceptical as to whether I’ve got it quite right.\n\n\n\n\n\n\nReflections\n\n\n\nDisregarding my attempts to backdate R and the packages, the provided code was actually quite simple to get up and running as a shiny app.\nHowever, it was provided with the article more for that purpose, than to be producing the items in the article, as the base parameters of the model differ, and as there is no code to process and generate the figures and results.\nI’ll keep working in latest R and packages, as current focus of this stage is just to try and reproduce the items. However, it would be good to try and figure out how to successfully backdate R and the packages, as that feels like an essential thing to be able to do, that I just hadn’t managed to get to the bottom of yet." }, { - "objectID": "logbook/posts/2024_07_12/index.html#badges", - "href": "logbook/posts/2024_07_12/index.html#badges", - "title": "Day 8", - "section": "10.58-11.06: Badges", - "text": "10.58-11.06: Badges\nAs mentioned in prior logbook entry, will now move on to evaluation stage.\nNotes on the unmet (and why)\n\narchive and id - only on GitHub\ncomplete - didn’t have the scenario and figure code\nstructure - not sufficient to facilitate reuse (i.e. would want more commenting/docstrings/dcoumentation), and as structure was designed for application (but had to extract code to make the paper results)\ndocumentation_… - no documentation provided\nregenerated - wasn’t able to reproduce all the items\nhour - took longer than an hour" + "objectID": "logbook/posts/2024_07_05/index.html#continuing-to-troubleshoot-in-text-results-1-and-2", + "href": "logbook/posts/2024_07_05/index.html#continuing-to-troubleshoot-in-text-results-1-and-2", + "title": "Day 3", + "section": "16.30-16.37, 16.43-16.48, 16.55-16.57: Continuing to troubleshoot in-text results 1 and 2", + "text": "16.30-16.37, 16.43-16.48, 16.55-16.57: Continuing to troubleshoot in-text results 1 and 2\nI realised that perhaps my issue as in incorrectly assuming that I should set inr_night to 0. There should be one INR person 24h, but because all the staff get put on a schedule, by removing the “night” person I technically only have someone during day time hours.\nI changed this and re-ran (with timer - can see it took 6.3 minutes).\nThis was definitely a fix - the waiting times now look far closer to what I expected (around 10 minutes rather than 200!). The median results are very small, but looking at the mean results:\n\nBaseline: 13.33 minutes\nExclusive: 8.58 minutes\nTwo AngioINR: 14.86 minutes\n\nHowever, still not quite right… 4.7 minute reduction for exclusive (should be 6 minutes) and 1.5 minute increase for two machines (should be 4 minute reduction). The exclusive is pretty close, although its not yet clear to me how much it varies between runs, and whether that could be reasonably attributed to be stochasticity or not. Given we’re comparing fairly small numbers, it is a bit on the fence for me, and wouldn’t yet say I feel confident in it being successfully reproduced.\nI tried re-running it all to see how much the results differed - and it was by a fair bit actually! Up to about a minute:\n\nBaseline: 13.65 minutes\nExclusive: 9.20 minutes\nTwo AngioINR: 13.61 minutes\n\nHowever, differences are still off the reported - 4.45 minute reduction and 0.01 minute reduction." }, { - "objectID": "logbook/posts/2024_07_12/index.html#stars-framework", - "href": "logbook/posts/2024_07_12/index.html#stars-framework", - "title": "Day 8", - "section": "11.07-11.16: STARS Framework", - "text": "11.07-11.16: STARS Framework" + "objectID": "logbook/posts/2024_07_05/index.html#timings", + "href": "logbook/posts/2024_07_05/index.html#timings", + "title": "Day 3", + "section": "Timings", + "text": "Timings\n\nimport sys\nsys.path.append('../')\nfrom timings import calculate_times\n\n# Minutes used prior to today\nused_to_date = 149\n\n# Times from today\ntimes = [\n ('09.46', '09.47'),\n ('09.48', '10.21'),\n ('10.40', '11.30'),\n ('11.35', '11.41'),\n ('11.41', '11.46'),\n ('11.52', '12.00'),\n ('12.07', '12.21'),\n ('13.00', '13.21'),\n ('13.28', '13.41'),\n ('13.42', '14.13'),\n ('14.22', '14.27'),\n ('14.29', '15.11'),\n ('15.32', '16.23'),\n ('16.30', '16.37'),\n ('16.43', '16.48'),\n ('16.55', '16.57')]\n\ncalculate_times(used_to_date, times)\n\nTime spent today: 294m, or 4h 54m\nTotal used to date: 443m, or 7h 23m\nTime remaining: 1957m, or 32h 37m\nUsed 18.5% of 40 hours max" }, { - "objectID": "logbook/posts/2024_07_12/index.html#stress-des", - "href": "logbook/posts/2024_07_12/index.html#stress-des", - "title": "Day 8", - "section": "11.26-11.51, 12.00-12.17, 13.04-13.18: STRESS-DES", - "text": "11.26-11.51, 12.00-12.17, 13.04-13.18: STRESS-DES\n\nUncertain\n\n\n\n\n\n\n\nItem\nMy comments\n\n\n\n\nSTRESS-DES 1.2 Model outputs. Define all quantitative performance measures that are reported, using equations where necessary. Specify how and when they are calculated during the model run along with how any measures of error such as confidence intervals are calculated.\nIt does describe the measures, and how these are calculated, and so I have said it met these criteria, although I did find it hard to understand/calculate the relative probability of waiting, and would’ve benefited from further detail/equations\n\n\nSTRESS-DES 1.3 Experimentation aims. If the model has been used for experimentation, state the objectives that it was used to investigate. (A) Scenario based analysis – Provide a name and description for each scenario, providing a rationale for the choice of scenarios and ensure that item 2.3 (below) is completed.\nI feel the paper does describe the scenarios clearly - my only hesitation is that I have been unable to successfully implement the exclusive use scenario - but that feels like a coding issue rather than a description issue? As, on the face of it, the article describes everything I need to know.\n\n\nSTRESS-DES 3.2 Pre-processing. Provide details of any data manipulation that has taken place before its use in the simulation, e.g. interpolation to account for missing data or the removal of outliers.\nNone provided, so presumed not applicable - but hard to say, as maybe there was just unmentioned. But as not possible to know either way, assumed not-applicable\n\n\nISPOR SDM 15 Is the model generalizability issue discussed?\nNot sure if it is partially or fully met?\n\n\n12 Is cross validation performed and reported\nIs it not met or not applicable? Introduction: “In contrast to other healthcare fields, a resource-use optimization model has not been implemented\n\n\nfor comprehensive stroke services.” Huang et al. (2019)" + "objectID": "logbook/posts/2024_10_02/index.html", + "href": "logbook/posts/2024_10_02/index.html", + "title": "Day 17", + "section": "", + "text": "Realised I had yet to archive repository, now that reproduction is complete. Update CITATION.cff and CHANGELOG.md then made a GitHub release." }, { - "objectID": "logbook/posts/2024_07_12/index.html#des-checklist-derived-from-ispor-sdm", - "href": "logbook/posts/2024_07_12/index.html#des-checklist-derived-from-ispor-sdm", - "title": "Day 8", - "section": "13.19-13.33, 13.39-13.43: DES checklist derived from ISPOR-SDM", - "text": "13.19-13.33, 13.39-13.43: DES checklist derived from ISPOR-SDM" + "objectID": "logbook/posts/2024_10_02/index.html#untimed-archive-repository", + "href": "logbook/posts/2024_10_02/index.html#untimed-archive-repository", + "title": "Day 17", + "section": "", + "text": "Realised I had yet to archive repository, now that reproduction is complete. Update CITATION.cff and CHANGELOG.md then made a GitHub release." }, { - "objectID": "logbook/posts/2024_07_12/index.html#timings-for-evaluation", - "href": "logbook/posts/2024_07_12/index.html#timings-for-evaluation", - "title": "Day 8", - "section": "Timings for evaluation", - "text": "Timings for evaluation\n\nimport sys\nsys.path.append('../')\nfrom timings import calculate_times\n\n# Minutes used prior to today\nused_to_date = 0\n\n# Times from today\ntimes = [\n ('10.58', '11.06'),\n ('11.07', '11.16'),\n ('11.26', '11.51'),\n ('12.00', '12.17'),\n ('13.04', '13.18'),\n ('13.19', '13.33'),\n ('13.39', '13.43')]\n\ncalculate_times(used_to_date, times, limit=False)\n\nTime spent today: 91m, or 1h 31m\nTotal used to date: 91m, or 1h 31m" + "objectID": "logbook/posts/2024_11_04/index.html", + "href": "logbook/posts/2024_11_04/index.html", + "title": "Day 18", + "section": "", + "text": "I noticed a mistake in my evaluation of the repository against STRESS-DES.\nCriteria: 5.2 Random sampling\nOriginal decision: 🟡 Partially met - no seeds but describes sampling of arrivals\nNew decision: ❌ Not met - as sampling of arrivals wasn’t relevant to this criteria (I had misunderstood)\nI amended reporting.qmd, reproduction_report.qmd and stars_wp1_summary accordingly." }, { - "objectID": "logbook/posts/2024_07_12/index.html#untimed-working-on-research-compendium-stage", - "href": "logbook/posts/2024_07_12/index.html#untimed-working-on-research-compendium-stage", - "title": "Day 8", - "section": "Untimed: Working on research compendium stage", - "text": "Untimed: Working on research compendium stage\nSome tidying up and sorting for research compendium stage inc.\n\nWorking on README for reproduction\nLooking into options for unit testing in R…\n\nPackage testthat\nuse_testthat(). This initializes the unit testing machinery for your package. It adds Suggests: testthat to DESCRIPTION, creates the directory tests/testthat/, and adds the script tests/testthat.R.\nuse_test(\"functionname\") to create matching testfile.\nlibrary(testthat), load_all(), test() to run the test. Tests will also run whenever check() package\nrename_files(\"strsplit1\", \"str_split_one\") to rename the R file and will also rename testthat file (which we also edit with new function name), to fit with convention of filename matching function name\nCan use expect_equal() to compare two dataframes\nFile structure: tests/, testthat.R, testthat, helper_func1.R, helper_func2.R, test_name.R\nTest files prefixed test_, keep data in files prefixed helper_" + "objectID": "logbook/posts/2024_11_04/index.html#untimed-amendment-to-evaluation", + "href": "logbook/posts/2024_11_04/index.html#untimed-amendment-to-evaluation", + "title": "Day 18", + "section": "", + "text": "I noticed a mistake in my evaluation of the repository against STRESS-DES.\nCriteria: 5.2 Random sampling\nOriginal decision: 🟡 Partially met - no seeds but describes sampling of arrivals\nNew decision: ❌ Not met - as sampling of arrivals wasn’t relevant to this criteria (I had misunderstood)\nI amended reporting.qmd, reproduction_report.qmd and stars_wp1_summary accordingly." }, { "objectID": "logbook/posts/2024_09_03/index.html", diff --git a/sitemap.xml b/sitemap.xml index 9f655e1..f47113e 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -10,19 +10,23 @@ https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_15/index.html - 2024-07-15T14:46:21.129Z + 2024-11-21T09:55:56.890Z - https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_10_02/index.html - 2024-10-02T15:37:43.221Z + https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_12/index.html + 2024-11-21T09:55:51.397Z - https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_05/index.html - 2024-07-09T10:42:51.717Z + https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_09/index.html + 2024-07-10T09:19:49.877Z - https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_22/index.html - 2024-07-23T08:21:46.142Z + https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_19/index.html + 2024-07-19T12:32:41.341Z + + + https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_11_21/index.html + 2024-11-21T10:04:56.947Z https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_03/index.html @@ -50,11 +54,11 @@ https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/evaluation/badges.html - 2024-07-19T12:38:13.818Z + 2024-11-21T10:01:43.438Z https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/evaluation/reporting.html - 2024-08-15T08:48:50.453Z + 2024-11-04T16:12:08.416Z https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/reproduction/scripts/reproduction.html @@ -102,7 +106,7 @@ https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/evaluation/reproduction_report.html - 2024-09-03T14:18:33.121Z + 2024-11-04T16:12:24.685Z https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_11/index.html @@ -125,16 +129,20 @@ 2024-07-19T07:06:27.664Z - https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_19/index.html - 2024-07-19T12:32:41.341Z + https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_22/index.html + 2024-07-23T08:21:46.142Z - https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_09/index.html - 2024-07-10T09:19:49.877Z + https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_05/index.html + 2024-07-09T10:42:51.717Z - https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_07_12/index.html - 2024-07-15T13:35:27.345Z + https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_10_02/index.html + 2024-10-02T15:37:43.221Z + + + https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_11_04/index.html + 2024-11-04T16:14:00.516Z https://pythonhealthdatascience.github.io/stars-reproduce-huang-2019/logbook/posts/2024_09_03/index.html

5.2 Random sampling State the algorithm used to generate random samples in the software/programming language used e.g. Mersenne Twister.
If common random numbers are used, state how seeds (or random number streams) are distributed among sampling processes.
🟡 PartiallySampling described for arrivals but not for length of time with resources. Doesn’t mention whether seeds are used.

Methods: Model Properties: Patients: “Patients are generated by a Poissone process with an inter-arrival time as specified in Table 1.”
Table 1. DES model inputs
Huang et al. (2019)
❌ Not metDoesn’t mention algorithm or whether seeds or streams are used (know from code that it does not though).
5.3 Model execution