14 Le fasi del progetto di analisi dei dati
14.1 Introduzione
Una gestione accurata ed efficace dei dati è fondamentale in molte discipline, inclusa la psicologia, dove l’analisi di dataset complessi rappresenta un aspetto centrale della ricerca. Garantire che i dati siano raccolti con precisione, organizzati in modo chiaro e facilmente accessibili per analisi e verifiche è essenziale per preservare l’integrità del lavoro scientifico e promuoverne la riproducibilità. Una gestione rigorosa dei dati assicura qualità e affidabilità in tutte le fasi di un progetto, dalla raccolta alla documentazione dei processi di elaborazione e delle eventuali modifiche apportate.
Dati ben organizzati e documentati non solo semplificano e rendono più efficiente il processo di analisi, ma riducono anche il rischio di errori, migliorando l’utilizzabilità e l’interpretazione delle informazioni. Questo è particolarmente rilevante quando si lavora con dataset provenienti da fonti eterogenee o con strutture complesse. Inoltre, la trasparenza e la completezza nella gestione dei dati rappresentano una condizione imprescindibile per garantire la riproducibilità della ricerca, un pilastro fondamentale della scienza. La possibilità per altri ricercatori di replicare i risultati utilizzando gli stessi dati e metodi rafforza la credibilità delle conclusioni e contribuisce a costruire un progresso scientifico condiviso e solido. Di conseguenza, una gestione dei dati responsabile non è solo una buona pratica, ma una necessità per la produzione di conoscenze affidabili e sostenibili.
14.2 Pianificazione del workflow in R: strategie per progetti sostenibili
14.2.1 L’importanza della pianificazione iniziale
Affrontare un progetto di analisi dati senza una pianificazione è come iniziare un esperimento psicologico senza ipotesi: si rischia di perdersi in tentativi disordinati. I programmatori esperti sanno che scrivere codice è solo il 20% del lavoro (Gillespie & Lovelace, 2016). Il restante 80% consiste nel definire obiettivi, prevenire errori e organizzare il processo.
Berkun (2005) sintetizza questo concetto con una massima: “Una preparazione intelligente minimizza il lavoro”. Approcci casuali, come scrivere codice senza strategia e correggere errori “al volo”, non solo sono inefficienti, ma espongono al rischio di debito tecnico (Kruchten et al., 2012) – l’accumulo di soluzioni temporanee che complicano il progetto nel lungo termine.
Esempio 14.1 Immaginate di dover analizzare dati di un esperimento sull’attenzione. Senza pianificazione, potreste:
- Importare i dati in modo disorganizzato, mischiando file RAW e modificati.
- Utilizzare funzioni non ottimali (es.:
merge()
invece di*_join()
didplyr
), rallentando l’analisi.
- Dimenticare di documentare passaggi critici, rendendo impossibile replicare i risultati.
14.2.2 Cinque pilastri per un workflow efficiente
Gillespie & Lovelace (2016) propone un framework basato su cinque principi, adattabili a progetti di psicologia:
-
Disegnare prima di programmare
- Utilizzare strumenti analogici (carta, lavagna) o digitali (Miro, draw.io) per:
- Mappare le variabili chiave dell’esperimento.
- Schematizzare il flusso di analisi (es.: “Dati grezzi → Pulizia → Inferenza → Grafici → Report”).
- Mappare le variabili chiave dell’esperimento.
- Esempio: Per uno studio longitudinale, tracciare una timeline delle fasi di raccolta dati e analisi.
- Utilizzare strumenti analogici (carta, lavagna) o digitali (Miro, draw.io) per:
-
Suddividere il lavoro in “chunk”
- Frammentare il progetto in task gestibili, usando il metodo SMART:
-
Specifico: “Creare un grafico a boxplot per il gruppo controllo vs sperimentale”.
-
Misurabile: “Il grafico deve includere valori p e intervalli di confidenza”.
-
Assegnabile: Delegare la pulizia dati a un collaboratore usando script condivisi.
-
Realistico: Stimare 3 ore per l’analisi preliminare, non un intero pomeriggio.
- Temporalizzato: “Completare l’importazione dati entro venerdì”.
-
Specifico: “Creare un grafico a boxplot per il gruppo controllo vs sperimentale”.
- Frammentare il progetto in task gestibili, usando il metodo SMART:
-
Selezionare i pacchetti con criterio
- Investire tempo nella ricerca di strumenti ottimali prima di iniziare:
-
janitor
per pulire nomi di colonne (es.:clean_names()
).
-
report
per generare automaticamente testi statistici in APA style.
-
- Investire tempo nella ricerca di strumenti ottimali prima di iniziare:
-
Documentazione continua
-
Integrare annotazioni direttamente nel codice:
# Pulizia dati: rimuovere partecipanti con >50% risposte mancanti (protocollo Smith et al., 2020) dati_puliti <- dati_raw %>% filter(complete.cases(.) >= 0.5)
Utilizzare Quarto per creare report dinamici che uniscono codice, risultati e interpretazioni.
-
-
Riproducibilità come priorità
-
Strutturare il progetto in cartelle chiaramente organizzate. Per esempio:
/progetto_psicologia ├── data/ ├── script/ ├── output/ └── report/
-
14.2.3 Gestire il debito tecnico
Anche in piccoli progetti, è cruciale adottare buone pratiche per mantenere il codice leggibile e gestibile nel tempo. Ecco alcune strategie utili:
1. Refactoring periodico
- Dedica del tempo ogni settimana (ad esempio 1 ora) per riorganizzare il codice.
- Sostituisci soluzioni complesse o ridondanti con alternative più efficienti e leggibili (es.: semplificare cicli for
con funzioni come map()
in R).
- Rimuovi codice non utilizzato o obsoleto.
2. Commenti chiari e utili
- Scrivi commenti esplicativi sopra ogni blocco di codice complesso per renderlo comprensibile anche a chi non ha scritto il progetto.
Esempio:
# Normalizza i dati usando la tecnica Min-Max scaling
normalized_data <- (data - min(data)) / (max(data) - min(data))
- Evita commenti ovvi (es.:
# Importa tidyverse
quando scrivilibrary(tidyverse)
).
- Aggiorna i commenti se modifichi il codice, per mantenerli coerenti con le modifiche.
3. Strutturare il progetto
Organizza il tuo progetto in cartelle e file ben definiti.
4. Checklist pre-consegna del progetto
Prima di consegnare o condividere il progetto, verifica:
- La presenza di commenti utili nei punti critici del codice.
- Che i dati originali siano conservati intatti nella cartella dedicata (
dati_raw/
).
- Che l’ambiente di lavoro sia documentato (es.: salva l’output di
sessionInfo()
in R).
5. Migliorare la leggibilità del codice
- Usa nomi di variabili descrittivi (es.:
media_punteggi
invece dix
).
- Mantieni una struttura coerente per indentazione e spaziatura.
- Dividi il codice in funzioni modulari per evitare script troppo lunghi e difficili da seguire.
14.3 Capacità di Gestione dei Dati in R
Una volta compresi i benefici di una pianificazione strategica, è importante disporre di strumenti adeguati per gestire, analizzare e documentare i dati. In questo capitolo ci concentreremo sul ruolo di R in un workflow efficiente di analisi dei dati. R è uno strumento potente e versatile, pensato per supportare tutte le fasi del ciclo di vita dei dati, dalla raccolta alla documentazione, risultando così un alleato indispensabile per chiunque lavori con dataset complessi. Le sue principali funzionalità includono:
-
Importazione ed esportazione dei dati: Pacchetti come
readr
erio
semplificano l’importazione di dati da fonti diverse (file CSV, database, API web) e l’esportazione in formati adatti a svariati utilizzi.
-
Pulizia e preparazione dei dati: Grazie a pacchetti come
dplyr
,tidyr
estringr
, R offre strumenti intuitivi per manipolare, trasformare e preparare i dati in modo efficiente, rendendoli pronti per l’analisi.
-
Esplorazione e sintesi: Con pacchetti come
dplyr
eggplot2
, R permette di calcolare statistiche descrittive, individuare pattern significativi e visualizzare distribuzioni e relazioni in modo chiaro e informativo.
-
Documentazione dinamica: Strumenti come R Markdown e Quarto consentono di integrare in un unico documento codice, analisi, testo esplicativo e risultati, facilitando la riproducibilità e la trasparenza del lavoro.
- Controllo delle versioni: L’integrazione di Git in RStudio offre un sistema di gestione delle versioni che consente di monitorare modifiche, collaborare con altri e garantire la tracciabilità del processo analitico.
La combinazione di pianificazione strategica e strumenti avanzati come R rappresenta un approccio vincente per affrontare progetti complessi. Le funzionalità di R, se utilizzate in modo appropriato, riducono al minimo il rischio di errori e massimizzano l’efficienza e l’affidabilità dei risultati.
14.4 Configurare l’Ambiente R
Per sfruttare al meglio le potenzialità di R è essenziale configurare correttamente RStudio e integrare i pacchetti fondamentali per la gestione dei dati. Una configurazione adeguata favorisce la riproducibilità e l’organizzazione del lavoro.
14.4.1 Workspace e Cronologia
Accedi a Tools > Global Options > General e modifica le seguenti impostazioni:
- Disabilita l’opzione Restore .RData into workspace at startup.
- Imposta Save workspace to .RData on exit su Never.
Queste scelte incoraggiano una gestione basata sugli script, rendendo il lavoro più trasparente e riducendo possibili conflitti tra sessioni diverse. Ogni analisi sarà così chiaramente documentata nel codice, evitando dipendenze da file temporanei o precedenti sessioni di lavoro.
14.4.2 Pacchetti Essenziali
R è composto da un modulo base che fornisce le funzionalità fondamentali del linguaggio, ma il suo potere deriva dall’ampio ecosistema di pacchetti. Per questo corso (e in generale per un workflow efficiente), utilizzeremo regolarmente i seguenti pacchetti:
-
here
: per la gestione ordinata dei percorsi relativi, evitando problemi con i percorsi assoluti.
-
tidyverse
: una raccolta di pacchetti (tra cuidplyr
,tidyr
,ggplot2
) essenziali per la manipolazione, l’analisi e la visualizzazione dei dati.
Assicurati di installarli e caricarli all’inizio di ogni script con i comandi:
14.4.3 Gestione dei Progetti
I progetti in RStudio rappresentano uno strumento chiave per mantenere il lavoro ben organizzato. Sfruttare i progetti consente di creare ambienti separati, in cui ogni progetto ha la propria directory dedicata.
Per creare un nuovo progetto:
- Vai su File > New Project.
- Seleziona la directory dove verrà creato il tuo progetto.
- Salva tutti i file correlati (script, dati, risultati) all’interno di questa directory.
Questo approccio previene confusione e facilita la navigazione, in quanto ogni progetto diventa un’unità autonoma, ideale per mantenere ordine e coerenza nel lavoro.
14.5 Il Ciclo di Vita di un Progetto di Data Science
Una volta configurato un ambiente stabile, organizzato e pronto per l’analisi, è possibile affrontare in modo sistematico le diverse fasi che caratterizzano tipicamente un progetto di Data Science. Secondo la proposta di (Yu & Barter, 2024), queste fasi sono:
-
Formulazione del problema e raccolta dei dati: Definizione delle domande di ricerca e acquisizione dei dataset.
-
Pulizia, preprocessing e analisi esplorativa: Preparazione dei dati per l’analisi attraverso trasformazioni e sintesi.
-
Analisi predittiva e/o inferenziale (opzionale): Modelli statistici o predittivi per rispondere alle domande di ricerca.
-
Valutazione dei risultati: Interpretazione e verifica delle conclusioni tratte.
- Comunicazione dei risultati: Presentazione dei risultati in forma visiva e narrativa.
Non tutti i progetti prevedono la fase di analisi predittiva, ma quasi tutti attraversano le altre fasi. Mantenere un approccio organizzato e ben strutturato lungo tutto il ciclo di vita riduce il rischio di errori e favorisce la riproducibilità.
14.5.1 Fase 1: Formulazione del Problema e Raccolta dei Dati
La definizione di una domanda di ricerca chiara e precisa rappresenta la base di qualunque progetto di data science. È cruciale stabilire con attenzione l’ambito dell’analisi:
Ambito Applicativo
In un contesto applicativo, l’obiettivo principale è spesso la realizzazione di un report descrittivo su un intervento o un’attività specifica (ad esempio, valutare l’efficacia di un programma di educazione sessuale rivolto agli adolescenti). In questo caso, l’attenzione si focalizza sulla descrizione dei risultati ottenuti, senza necessariamente approfondire i fondamenti teorici.Ambito della Ricerca Psicologica
In un contesto di ricerca, invece, diventa essenziale giustificare le scelte metodologiche, la selezione degli strumenti di misura e la formulazione delle domande di ricerca sulla base della letteratura esistente e di teorie consolidate. (Questo è oggetto di approfondimento nel sec-measurement.)
14.5.1.1 Caratteristiche di una Buona Domanda di Ricerca
La domanda di ricerca deve essere formulata in modo che sia possibile rispondervi analizzando i dati a disposizione. Talvolta, la domanda iniziale può risultare troppo ampia o irrealistica rispetto ai dati disponibili, rendendo necessario un processo di revisione. L’obiettivo è assicurare che i dati raccolti (o da raccogliere) siano appropriati e sufficienti a fornire una risposta solida al quesito di partenza.
14.5.1.2 Raccolta dei Dati
In questa fase, è altrettanto cruciale identificare chiaramente i dati da utilizzare e comprenderne la provenienza. Esistono principalmente due scenari:
Utilizzo di Dati Esistenti
Alcuni progetti si basano su dataset già disponibili, reperiti da repository pubblici, database aziendali o esperimenti precedenti.Nuova Raccolta di Dati
Altri progetti richiedono la raccolta di dati ex novo. In entrambi i casi, è importante pianificare con cura le analisi prima di avviare la raccolta, onde evitare di ritrovarsi con dataset incompleti o non adatti agli obiettivi.
È inoltre essenziale documentare accuratamente le tecniche e procedure utilizzate per la raccolta dati, nonché valutare e dichiarare eventuali limitazioni che possano inficiare l’interpretazione dei risultati.
14.5.2 Fase 2: Pulizia dei Dati e Analisi Esplorativa
14.5.2.1 Importazione ed Esportazione dei Dati in R
Una volta individuati i dati, occorre importarli in R in un formato adatto all’analisi, tipicamente in un data frame. Il pacchetto rio
fornisce la funzione universale import()
, che rende superfluo l’uso di funzioni specifiche per ciascun formato (es. .csv
, .xlsx
, .json
, ecc.). Per organizzare al meglio i file, si consiglia di creare una struttura di cartelle chiara (es. data/raw
per i dati grezzi e data/processed
per i dati elaborati) e di usare percorsi relativi attraverso il pacchetto here.
Esempio di importazione:
Per esportare i dati elaborati:
Questa strategia migliora la portabilità (il progetto può essere facilmente trasferito su altri computer) e la riproducibilità (poiché non è necessario modificare manualmente i percorsi dei file).
14.5.2.2 Pulizia dei Dati
Dopo avere definito la domanda di ricerca e recuperato i dati, il passo successivo è la pulizia. Un dataset “pulito” è ordinato, coerente e privo di ambiguità, così che sia comprensibile sia per il computer sia per l’analista. La pulizia dei dati implica l’individuazione di valori anomali, formattazioni errate, duplicati, incongruenze e valori mancanti, per poi sistemarli in modo appropriato (con codice, senza alterare i file dei dati grezzi originali).
La pulizia dei dati è una fase cruciale: aiuta a sviluppare una comprensione più approfondita del dataset e delle sue eventuali limitazioni. L’obiettivo è creare una versione dei dati che rifletta il più fedelmente possibile la realtà e che sia interpretata correttamente dal computer.
14.5.2.3 Preprocessing
Il preprocessing consiste nell’effettuare quelle trasformazioni sui dati puliti che sono richieste da specifici algoritmi di analisi o di modellazione. Ad esempio, alcuni modelli possono richiedere variabili su scale comparabili oppure l’assenza di valori mancanti. Durante il preprocessing, si possono anche generare nuove variabili ritenute utili all’analisi.
Non esiste una procedura di preprocessing “universale”: ogni scelta va documentata e motivata, poiché implica decisioni soggettive che influiscono sull’interpretazione finale dei risultati.
14.5.2.4 Analisi Esplorativa dei Dati
Dopo l’importazione, la pulizia e il preprocessing, è il momento di esplorare il dataset. L’Analisi Esplorativa dei Dati (Exploratory Data Analysis, EDA) comprende:
- Calcolo di statistiche descrittive (misure di tendenza centrale, dispersione, etc.)
- Identificazione di pattern e distribuzioni insolite
- Creazione di tabelle di contingenza e diagrammi (istogrammi, boxplot, scatterplot, ecc.)
L’obiettivo principale è far familiarizzare il ricercatore con la struttura dei dati e fornire ipotesi da verificare nelle fasi successive.
14.5.3 Fase 3: Analisi Predittiva e Inferenziale
A seconda degli obiettivi del progetto, l’analisi può includere modelli statistici o algoritmi di machine learning orientati all’inferenza e/o alla previsione. In psicologia, ciò può tradursi nell’uso di modelli di regressione, test statistici, modelli misti o metodi di classificazione e clustering. L’obiettivo è rispondere a domande di ricerca specifiche o fare inferenze su una popolazione più ampia. Nei contesti applicativi, può riguardare la costruzione di modelli predittivi per stimare il comportamento di variabili di interesse sulla base dei dati storici.
14.5.4 Fase 4: Valutazione dei Risultati
In questa fase si valuta la bontà dei risultati ottenuti, sia dal punto di vista quantitativo (applicando metriche appropriate o test statistici) sia qualitativo (interpretazione teorica o pratica dei risultati). È il momento di ricollegarsi alla domanda di ricerca iniziale, per verificare se gli obiettivi sono stati raggiunti e quali implicazioni emergono.
14.5.5 Fase 5: Comunicazione dei Risultati
L’ultima fase consiste nella comunicazione dei risultati a un pubblico più ampio, che può essere composto da ricercatori, committenti, stakeholder o utenti finali. È essenziale presentare i risultati in maniera chiara e accessibile, evitando di dare per scontata una profonda conoscenza del progetto o del gergo tecnico. Si può optare per:
-
Articoli scientifici: per condividere le scoperte con la comunità accademica.
-
Report interni: per informare un team di lavoro o un ente finanziatore.
- Presentazioni: per trasmettere rapidamente i risultati a un pubblico non specialistico.
Una comunicazione efficace richiede di spiegare in modo comprensibile le analisi e le figure mostrate, fornendo una guida interpretativa. L’uso di grafici e diagrammi ben curati può facilitare molto la fruizione delle informazioni.
14.6 Organizzazione del Progetto
Un aspetto fondamentale per il successo e la riproducibilità di un progetto di analisi dati è l’organizzazione efficiente dei file, che include dati, codice e documentazione. Questi file dovrebbero essere riuniti all’interno di una singola cartella (o directory) dedicata al progetto.
14.6.1 Home Directory
In RStudio, è possibile creare un file nome_del_progetto.Rproj
, che definisce la cartella principale (home directory) da cui R avvia il lavoro. Basta aprire RStudio cliccando su questo file per lavorare automaticamente all’interno dell’ambiente del progetto, rendendo più agevole l’uso di percorsi relativi e la gestione di script, dati e output.
14.6.2 Struttura di un Progetto
Yu & Barter (2024) propone un template per organizzare in modo chiaro un progetto di analisi dati:
nome_progetto/
├── nome_progetto.Rproj
├── data/
│ ├── raw/
│ │ └── my_data.csv
│ ├── processed/
├── dslc_documentation/
│ ├── 01_data_cleaning.qmd
│ ├── 02_analysis.qmd
│ └── functions/
└── README.md
-
data/
:-
raw/
: contiene i dati grezzi, mai modificati;
-
processed/
: ospita i dati puliti ed elaborati, pronti per l’analisi;
- Importante inserire un codebook per documentare il significato delle variabili e le unità di misura.
-
-
dslc_documentation/
:- Contiene i file necessari per l’analisi (in Quarto
.qmd
, Jupyter Notebook.ipynb
, o altro).
- Può includere una sottocartella
functions/
con script.R
o.py
contenenti funzioni personalizzate.
- Contiene i file necessari per l’analisi (in Quarto
-
README.md
:- Descrive la struttura del progetto, gli obiettivi e i passaggi per replicare le analisi.
14.6.2.1 Vantaggi di questa struttura
-
Organizzazione Chiara: separare i dati grezzi da quelli elaborati riduce la confusione e il rischio di modifiche involontarie ai dati originali.
-
Riproducibilità: la presenza di documentazione completa (codebook, file di analisi, README) consente di comprendere e replicare i risultati anche a distanza di tempo o da parte di terzi.
-
Portabilità: lavorando con percorsi relativi (es. grazie al pacchetto here in R), l’intero progetto può essere trasferito da un computer all’altro senza bisogno di modificare il codice.
-
Efficienza: la sottocartella
functions/
permette di riutilizzare codice e funzioni personalizzate, evitando duplicazioni negli script principali.
14.7 Riflessioni Conclusive
La forza e la bellezza del codice risiedono nella sua riusabilità: una volta scritto, può essere eseguito infinite volte per ottenere risultati coerenti. Se l’ambiente di lavoro è configurato correttamente, lo stesso codice applicato agli stessi dati fornirà sempre gli stessi output. Questo principio, chiamato riproducibilità computazionale, è essenziale per garantire trasparenza e affidabilità nel lavoro scientifico.
La riproducibilità offre numerosi benefici:
Monitorare le modifiche del progetto
La capacità di riprodurre il lavoro facilita il monitoraggio dell’evoluzione del progetto e delle scelte implementative nel tempo.Riprodurre il proprio lavoro
Il primo vero vantaggio della riproducibilità è per chi ha sviluppato il codice: tornare a distanza di mesi (o anni) su un progetto e ritrovare un flusso di lavoro chiaro e replicabile agevola enormemente la revisione o l’estensione delle analisi.Condivisione e crescita collettiva
Mettere a disposizione il proprio lavoro in forma riproducibile consente ad altri ricercatori di validare e ampliare i risultati, stimolando un progresso scientifico collettivo e robusto.
Rendere il proprio lavoro riproducibile richiede attenzione alla documentazione, un’organizzazione solida del progetto e l’uso di strumenti adeguati per garantire la stabilità dell’ambiente. I metodi e le tecniche esplorate in questo capitolo – dalla pianificazione strategica alla pulizia dei dati, dalla struttura delle cartelle al controllo di versione – sono tutti tasselli fondamentali per realizzare analisi rigorose, verificabili e di valore duraturo.
In sintesi, un progetto di Data Science di successo richiede sia un’accurata pianificazione strategica – per evitare debiti tecnici e massimizzare l’efficacia del proprio lavoro – sia l’uso di strumenti adeguati, come R e i relativi pacchetti, in un ambiente ben configurato. Seguire un ciclo di vita del progetto ben definito e mantenere un’organizzazione logica di dati, codice e documentazione consente di promuovere l’efficienza, ridurre i rischi di errore e favorire la riproducibilità, un valore fondante della scienza moderna.
14.8 Esercizi
Informazioni sull’Ambiente di Sviluppo
sessionInfo()
#> R version 4.5.0 (2025-04-11)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Sequoia 15.5
#>
#> Matrix products: default
#> BLAS: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.1
#>
#> locale:
#> [1] C/UTF-8/C/C/C/C
#>
#> time zone: Europe/Rome
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] thematic_0.1.6 MetBrewer_0.2.0 ggokabeito_0.1.0 see_0.11.0
#> [5] gridExtra_2.3 patchwork_1.3.0 bayesplot_1.12.0 psych_2.5.3
#> [9] scales_1.4.0 markdown_2.0 knitr_1.50 lubridate_1.9.4
#> [13] forcats_1.0.0 stringr_1.5.1 dplyr_1.1.4 purrr_1.0.4
#> [17] readr_2.1.5 tidyr_1.3.1 tibble_3.2.1 ggplot2_3.5.2
#> [21] tidyverse_2.0.0 rio_1.2.3 here_1.0.1
#>
#> loaded via a namespace (and not attached):
#> [1] generics_0.1.4 stringi_1.8.7 lattice_0.22-7
#> [4] hms_1.1.3 digest_0.6.37 magrittr_2.0.3
#> [7] evaluate_1.0.3 grid_4.5.0 timechange_0.3.0
#> [10] RColorBrewer_1.1-3 fastmap_1.2.0 rprojroot_2.0.4
#> [13] jsonlite_2.0.0 mnormt_2.1.1 cli_3.6.5
#> [16] rlang_1.1.6 withr_3.0.2 tools_4.5.0
#> [19] parallel_4.5.0 tzdb_0.5.0 pacman_0.5.1
#> [22] vctrs_0.6.5 R6_2.6.1 lifecycle_1.0.4
#> [25] htmlwidgets_1.6.4 pkgconfig_2.0.3 pillar_1.10.2
#> [28] gtable_0.3.6 glue_1.8.0 xfun_0.52
#> [31] tidyselect_1.2.1 rstudioapi_0.17.1 farver_2.1.2
#> [34] htmltools_0.5.8.1 nlme_3.1-168 rmarkdown_2.29
#> [37] compiler_4.5.0