Publikacje naukowe · Otwarte dane

Pakiet replikacyjny – jak przygotować dane i kod do artykułu (OSF)

Jak spakować dane, książkę kodową i skrypty R tak, by obca osoba odtworzyła Twoje wyniki: struktura folderów, README, renv i sessionInfo(), anonimizacja zgodna z RODO, licencje, OSF krok po kroku i deklaracja dostępności danych. Z szablonem ZIP, którego skrypty działają od zera.

Strona główna / Blog / Pakiet replikacyjny
W skrócie: Pakiet replikacyjny to dane (po anonimizacji), książka kodowa, skrypty, opis środowiska obliczeniowego, licencja i plik README, które pozwalają innej osobie odtworzyć liczby z Twojego artykułu. Umieść go w repozytorium z DOI, np. na OSF, a w artykule podaj deklarację dostępności danych z identyfikatorem i warunkami dostępu. Przed publikacją rozpakuj pakiet w pustym folderze i uruchom skrypty od zera – jeśli coś nie działa u Ciebie, nie zadziała u nikogo.

Po co pakiet replikacyjny i kto go wymaga

Pakiet replikacyjny to zestaw plików, który pozwala innej osobie odtworzyć liczby z Twojego artykułu: dane (albo ich bezpieczny odpowiednik), książka kodowa, skrypty, opis środowiska obliczeniowego, licencja i plik README, który mówi, co z tym zrobić. Chodzi o odtwarzalność obliczeniową – te same dane i ten sam kod mają dać te same tabele. To coś innego niż replikowalność, czyli uzyskanie zgodnego wniosku w nowym badaniu, ale bez pierwszej trudno mówić o drugiej.

„Dane dostępne na prośbę” to w praktyce za mało. Gabelica i in. (2022) przeanalizowali 3556 artykułów z czasopism otwartego dostępu. Najczęstsza deklaracja (42%) brzmiała „dostępne na uzasadnioną prośbę”. Spośród 1792 autorów, którzy zadeklarowali gotowość udostępnienia danych, 1669 (93%) nie odpowiedziało albo odmówiło, a dane przekazało tylko 123 (6.8%). Nawet udostępnione pliki często nie wystarczają:

  • po wprowadzeniu obowiązku otwartych danych w czasopiśmie Cognition odsetek artykułów z deklaracją dostępności danych wzrósł z 25% do 78%, ale przy próbie odtworzenia wyników 35 artykułów w 11 z 22 w pełni odtworzonych potrzebna była pomoc autorów, a w 13 części wartości nie odtworzono mimo tej pomocy (Hardwicke i in., 2018);
  • w 62 registered reports z psychologii dane i kod udostępniono w 36 (58%), a główne wyniki udało się odtworzyć w 21 z tych 36 artykułów (Obels i in., 2020);
  • z ponad 9000 plików R z repozytorium Harvard Dataverse 74% zakończyło się błędem przy pierwszym uruchomieniu w czystym środowisku (Trisovic i in., 2022).

Coraz częściej udostępnienie danych jest obowiązkiem, a nie gestem. PLOS od 3 marca 2014 r. wymaga, by w chwili publikacji wszystkie dane potrzebne do odtworzenia wyników były publicznie dostępne, a każdy artykuł miał deklarację dostępności danych z nazwą repozytorium i identyfikatorem (PLOS, b.d.). Narodowe Centrum Nauki od 2019 r. wymaga we wnioskach planu zarządzania danymi, który oceniają eksperci. Po zmianie zasad z 26 czerwca 2025 r. publikowanie w otwartym dostępie przestało być obowiązkowe, ale zasady udostępniania danych badawczych zostały bez zmian (Narodowe Centrum Nauki, b.d.). Wytyczne NCN mówią, że dane należy udostępnić najpóźniej w momencie publikacji wyników i przechowywać co najmniej 10 lat (Narodowe Centrum Nauki, 2020). Wspólnym mianownikiem tych wymagań są zasady FAIR: dane mają być łatwe do znalezienia, dostępne, interoperacyjne i nadające się do ponownego użycia – także przez maszyny (Wilkinson i in., 2016). To jeden z filarów open science i odpowiedź na kryzys replikacyjny w psychologii.

Co wchodzi do pakietu – lista minimalna

Elementy pakietu replikacyjnego, ich cel i zalecany format
ElementPo coFormat
READMEMówi, co jest w pakiecie, jak go uruchomić i jak go cytowaćMarkdown lub zwykły tekst (README.md)
Dane surowe (po anonimizacji)Punkt wyjścia wszystkich analiz; nigdy nie edytowane ręcznieCSV w UTF-8 (otwarty format)
Książka kodowaNazwy zmiennych, etykiety, wartości, kody braków, pozycje odwróconeCSV (codebook.csv)
SkryptyKażdy krok od danych surowych do liczb w artykuleR, Python albo składnia SPSS
Opis środowiskaWersje programu i pakietów, ziarno generatora liczb losowychsessionInfo.txt, renv.lock
LicencjaMówi, co inni mogą zrobić z danymi i kodemLICENCJA.md + wybór licencji w repozytorium
MateriałyProcedura, instrukcje, bodźce, pytania własnePDF, Markdown
PowiązaniaLink do prerejestracji i DOI artykułuW README

Wszystkie te elementy znajdziesz w szablonie do pobrania: pakiet-replikacyjny-szablon.zip (13 KB). Zawiera README, książkę kodową, dwa skrypty R, opis licencji, projekt RStudio i przykładowe dane symulowane z fikcyjnego eksperymentu: czy ćwiczenie samowspółczucia obniża lęk przed oceną. Jego plan analizy omawiamy we wpisie o planie analizy statystycznej i prerejestracji. Skrypty działają na danych z paczki – sprawdziliśmy to, rozpakowując archiwum do pustego folderu i uruchamiając je od zera (wyniki w sekcji z kodem).

Struktura folderów

Wilson i in. (2017) w zestawie „wystarczająco dobrych” praktyk obliczeniowych radzą rozdzielić dokumenty, dane, wyniki i kod do osobnych katalogów, a w katalogu głównym trzymać pliki README, LICENSE i CITATION. Dane surowe zachowaj w niezmienionej postaci – najlepiej z prawem tylko do odczytu – i z kopią zapasową. Szablon stosuje tę logikę z polskimi nazwami katalogów i dwoma numerowanymi skryptami w katalogu głównym. Dzięki temu katalog roboczy R to po prostu folder pakietu, a numer pliku mówi, co uruchomić najpierw.

Drzewo folderów pakietu replikacyjnego: w katalogu głównym README.md, LICENCJA.md, codebook.csv, projekt RStudio i skrypty 01_przygotowanie.R oraz 02_analiza.R; folder dane z podfolderem surowe (plik badanie_surowe.csv, 296 osób, tylko do odczytu) i pustym podfolderem przetworzone; folder materialy z plikiem OPIS.md; folder wyniki z pustymi podfolderami tabele i rysunki, które wypełniają skrypty
Rysunek 1. Struktura pakietu replikacyjnego z pliku ZIP do pobrania. Na niebiesko foldery, które wypełniają skrypty; w paczce są puste, bo wszystko, co da się odtworzyć z kodu, powinno powstawać z kodu. Rysunek przygotowano w R (ggplot2) na podstawie listy plików w archiwum.

Trzy zasady, które oszczędzają najwięcej kłopotów:

  • Dane surowe są nietykalne. Każdą zmianę – rekodowanie, wykluczenia, wyniki skal – robi skrypt, a jego wynik trafia do osobnego folderu.
  • Wszystko, co powstaje z kodu, można usunąć. Folder wyniki/ i plik analityczny da się w każdej chwili skasować i odtworzyć jednym uruchomieniem.
  • Jedna wersja prawdy. Liczby w artykule pochodzą z plików w wyniki/, a nie z ręcznie poprawianych tabel w edytorze tekstu.

README – wzór

README to pierwszy plik, który ktoś otworzy, więc ma odpowiedzieć na trzy pytania: co to jest, jak to uruchomić i jak to cytować. Wilson i in. (2017) wymieniają minimum: tytuł, krótki opis, aktualny kontakt i przykład, jak uruchomić analizy. Wytyczne NCN do planu zarządzania danymi wskazują pliki README i książkę kodową jako miejsca, w których utrwala się metadane – definicje zmiennych, jednostki, konwencje nazw, wersje i strukturę folderów (Narodowe Centrum Nauki, 2020). Poniżej skrócona wersja README z szablonu.

# Pakiet replikacyjny: [tytuł artykułu]

Autorzy: [imię i nazwisko, ORCID] · Kontakt: [instytucjonalny adres e-mail]
Artykuł: [odwołanie APA z DOI] · Prerejestracja: [DOI rejestracji] · Repozytorium: [DOI projektu OSF]
Wersja pakietu: 1.0 ([RRRR-MM-DD])

## Jak odtworzyć wyniki
1. Zainstaluj R w wersji 4.1 lub nowszej (skrypty używają tylko pakietów wbudowanych w R).
2. Rozpakuj archiwum i otwórz pakiet-replikacyjny.Rproj albo ustaw katalog roboczy na folder pakietu.
3. Uruchom kolejno: Rscript 01_przygotowanie.R, a potem Rscript 02_analiza.R.
4. Porównaj pliki w wyniki/tabele/ z tabelami w artykule (Tabela 1: statystyki opisowe, Tabela 2: test H1).
Kontrola: w analizie są 262 osoby, a wiersz „warunek” w tabeli 2 ma b = −0.277, 95% CI [−0.462, −0.092].

## Dane
dane/surowe/badanie_surowe.csv – [N] osób, jeden wiersz to jedna osoba, UTF-8, braki zapisane jako −99. Opis zmiennych: codebook.csv. Przed publikacją usunięto: [np. adresy IP, daty wypełnienia, dokładny wiek].

## Środowisko
Wyniki uzyskano w [R 4.5.3]; szczegóły: wyniki/sessionInfo.txt. Ziarno bootstrapu: set.seed(20261016).

## Licencja
Dane: CC BY 4.0. Kod: MIT. Szczegóły: LICENCJA.md.

## Jak cytować
[Autor, A. A. (RRRR). Tytuł pakietu [Zbiór danych i kod]. OSF. https://doi.org/...]

Wartości kontrolne w README to prosty trik: osoba odtwarzająca wyniki od razu widzi, czy dostała te same liczby, zanim zacznie porównywać całe tabele.

Książka kodowa: codebook.csv

Książka kodowa opisuje każdą zmienną w pliku danych. W szablonie ma kolumny: nazwa zmiennej, plik, w którym występuje, etykieta, typ, dozwolone wartości, kod braków i uwagi. Zapisanie jej jako CSV, a nie tylko jako tabeli w Wordzie, ma praktyczną zaletę: skrypt może ją wczytać i sprawdzić, czy dane się z nią zgadzają. W szablonie 01_przygotowanie.R zatrzymuje się błędem, jeśli w pliku danych jest zmienna nieopisana w książce kodowej albo odpowiedź spoza zakresu 1–5.

Fragment książki kodowej z szablonu pakietu replikacyjnego
zmiennaetykietawartościbrakiuwagi
warunekWarunek eksperymentalny0 = ćwiczenie kontrolne; 1 = ćwiczenie samowspółczuciabrakPrzydział losowy 1:1
wiek_katWiek w przedziałach18-20; 21-23; 24-26; 27+−99Dokładny wiek usunięto (anonimizacja)
lek_po_2Lęk po zadaniu – pozycja 21–5−99Pozycja odwrócona: 6 − odpowiedź
lek_poLęk po zadaniu – wynik skali1–5 (średnia 6 pozycji)brakTworzy 01_przygotowanie.R; co najmniej 5 odpowiedzi

Zasady kodowania – jeden wiersz to jedna osoba, spójne kody braków danych, pozycje odwrócone opisane wprost – omawiamy szczegółowo w poradniku jak przygotować bazę danych do analizy, a eksport z formularzy online w tekście dane z Google Forms i LimeSurvey. Dla pakietu ważne jest jedno: każda zmienna wyliczona w skrypcie też powinna mieć wiersz w książce kodowej, z informacją, który skrypt ją tworzy i jak (rekodowanie, średnia, próg).

Skrypty, które działają od zera

Skrypt, który działa tylko na Twoim komputerze, nie jest częścią pakietu replikacyjnego. Trisovic i in. (2022) zauważają, że wielu błędów w udostępnionym kodzie R można uniknąć dzięki dobrym praktykom programistycznym. Oto te, które mają największe znaczenie:

  1. Ścieżki względne. Żadnego setwd("C:/Users/..."). Skrypt zakłada, że katalogiem roboczym jest folder pakietu, i używa ścieżek w rodzaju file.path("dane", "surowe", "badanie_surowe.csv"). Plik projektu RStudio (.Rproj) ustawia katalog roboczy sam.
  2. Numerowane kroki. 01_przygotowanie.R tworzy plik analityczny, 02_analiza.R liczy wszystko, co jest w artykule. Każdy skrypt czyta pliki z dysku, więc nie zależy od tego, co zostało w pamięci po poprzedniej sesji.
  3. Ziarno generatora liczb losowych. Bootstrap, imputacja wielokrotna czy symulacja dają przy każdym uruchomieniu trochę inne liczby. set.seed() przed losowaniem sprawia, że wynik jest powtarzalny; wartość ziarna wpisz do README.
  4. Zapis środowiska. Na końcu analizy zapisz sessionInfo() do pliku – to wersja R, systemu i pakietów. Jeśli używasz pakietów spoza instalacji bazowej, zapisz ich wersje pakietem renv: według dokumentacji renv::init() zakłada w projekcie osobną bibliotekę pakietów i tworzy plik renv.lock, renv::snapshot() aktualizuje ten plik (działa też w projekcie bez renv), a renv::restore() instaluje zapisane w nim wersje.
  5. Kontrole wbudowane w kod. stopifnot() zatrzyma analizę, gdy dane nie zgadzają się z książką kodową, gdy identyfikatory się powtarzają albo gdy pojawi się odpowiedź spoza skali.
  6. Wyniki do plików. Tabele zapisuj jako CSV, rysunki jako PNG lub SVG. Liczby w artykule przepisuj z tych plików, nie z konsoli.

Jeśli liczysz w SPSS, zasada jest ta sama: zamiast klikać, zapisz składnię (syntax) do pliku .sps i dołącz ją do pakietu razem z informacją o wersji programu. W R całą ścieżkę od danych do wyników zamykają dwa skrypty pokazane w sekcji z kodem.

Schemat przepływu: dane surowe badanie_surowe.csv (N = 296), skrypt 01_przygotowanie.R (kody braków, pozycje odwrócone, wyniki skal, wykluczenia), plik analityczny badanie_analiza.csv (N = 262) z przepływem osób, skrypt 02_analiza.R (statystyki opisowe, ANCOVA, d z bootstrapem, test Welcha), wyniki (tabele CSV, rysunek PNG, sessionInfo.txt) i artykuł; książka kodowa zasila pierwszy skrypt, a opis środowiska dotyczy obu skryptów
Rysunek 2. Przepływ od danych surowych do liczb w artykule w pakiecie z tego wpisu. Liczebności (296 osób w danych surowych, 262 w analizie) pochodzą z testowego uruchomienia skryptów na danych symulowanych. Rysunek przygotowano w R (ggplot2).

W przykładzie skrypt 01 wykluczył 22 osoby z powodu błędnej odpowiedzi na pytanie kontrolne, 7 z powodu zbyt krótkiego czasu wypełnienia, 3 z powodu braków w zmiennej zależnej i 2 z powodu braku kowarianty, zostawiając 262 osoby (134 w grupie kontrolnej, 128 w grupie ćwiczenia). Skrypt 02 policzył test hipotezy H1 – ANCOVA z lękiem wyjściowym jako kowariantą – wielkość efektu d z bootstrapowym przedziałem ufności i analizę wrażliwości testem Welcha. Gotowe zdania do opisu takich wyników znajdziesz w poradniku jak opisać wyniki w stylu APA. Jeśli chcesz, by kod pozwalający odtworzyć obliczenia przygotował lub sprawdził ktoś z zewnątrz, zajrzyj do oferty analiz statystycznych dla badaczy.

Anonimizacja i RODO: co wolno udostępnić

To nie jest porada prawna. Zanim udostępnisz dane osób badanych, skonsultuj plan z komisją etyczną i inspektorem ochrony danych swojej instytucji. Poniżej opisujemy pojęcia z RODO i praktyczne techniki, które pomagają w tej rozmowie.

RODO definiuje dane osobowe jako informacje o zidentyfikowanej lub możliwej do zidentyfikowania osobie fizycznej, czyli takiej, którą można zidentyfikować bezpośrednio lub pośrednio – m.in. na podstawie imienia i nazwiska, numeru identyfikacyjnego, danych o lokalizacji, identyfikatora internetowego albo czynników określających np. fizyczną, psychiczną, ekonomiczną, kulturową lub społeczną tożsamość (art. 4 pkt 1). Pseudonimizacja to przetworzenie danych tak, by bez dodatkowych informacji, przechowywanych osobno i chronionych, nie dało się ich przypisać konkretnej osobie (art. 4 pkt 5). Motyw 26 rozporządzenia wyjaśnia różnicę, która decyduje o wszystkim:

  • dane spseudonimizowane, które przy użyciu dodatkowych informacji można przypisać osobie, nadal są danymi osobowymi;
  • informacje anonimowe – takie, które nie pozwalają zidentyfikować osoby przy użyciu rozsądnie prawdopodobnych sposobów (z uwzględnieniem kosztu, czasu i dostępnej technologii) – nie podlegają RODO, także gdy są przetwarzane do celów naukowych lub statystycznych.

Art. 89 wymaga, by przetwarzanie do celów badań naukowych miało odpowiednie zabezpieczenia, zwłaszcza minimalizację danych, i – gdy pozwala to zrealizować cel – korzystało z danych, które nie pozwalają zidentyfikować osób (Parlament Europejski i Rada Unii Europejskiej, 2016). Zastąpienie nazwiska kodem to więc dopiero pseudonimizacja: dopóki gdzieś istnieje lista łącząca kody z osobami, dane są osobowe. Pamiętaj też, że dane dotyczące zdrowia należą do szczególnych kategorii danych (art. 9) – a odpowiedzi na część skal, np. objawów depresji czy lęku, mogą być właśnie takimi danymi. Szerzej o zgodzie i podstawach prawnych piszemy w haśle świadoma zgoda i RODO w badaniach.

Identyfikatory bezpośrednie i pośrednie

Identyfikatory bezpośrednie – imię i nazwisko, adres e-mail, numer telefonu, adres IP, identyfikator panelu – usuń zawsze. Trudniejsze są identyfikatory pośrednie: wiek, płeć, kierunek, rok studiów, miejscowość, dokładne daty. Każdy z osobna jest niewinny, ale razem tworzą unikatowe kombinacje. Rocher i in. (2019) oszacowali, że 99.98% Amerykanów zostałoby poprawnie zidentyfikowanych w zbiorze zawierającym 15 cech demograficznych. Ich zdaniem nawet mocno spróbkowane, „zanonimizowane” zbiory raczej nie spełniają standardów anonimizacji z RODO. PLOS wymienia wprost dane, których nie należy udostępniać – m.in. nazwiska, inicjały, adresy, adresy IP, dokładne daty (np. urodzenia), dane kontaktowe i dane o lokalizacji. Zaznacza też, że w małych grupach identyfikujące mogą być także kombinacje cech takich jak płeć czy miejsce (PLOS, b.d.).

Rysunek 3 pokazuje to na symulacji 300 osób z jednego wydziału. Sama płeć nie wyróżnia nikogo, ale po dodaniu roku urodzenia, kierunku i roku studiów unikatowa jest kombinacja cech 55.7% osób, a po dodaniu województwa – 82.7%. Uogólnienie cech (przedziały wieku zamiast roku urodzenia, tylko duże kierunki, stopień studiów zamiast roku, „województwo uczelni albo inne”) obniża odsetek unikatowych rekordów do 12.3%, ale w grupach mniejszych niż 5 osób wciąż jest 59.0% rekordów. Wniosek praktyczny: publikuj tylko te cechy, których potrzebują analizy z artykułu, a resztę usuń albo uogólnij.

Wykres słupkowy odsetka rekordów unikatowych i rekordów w grupach mniejszych niż 5 osób po dodawaniu kolejnych cech: płeć 0%, z rokiem urodzenia 1.7%, z kierunkiem 23.0%, z rokiem studiów 55.7%, z województwem 82.7% rekordów unikatowych; po uogólnieniu cech odpowiednio 0%, 0%, 2.3%, 4.7% i 12.3%. W grupach mniejszych niż 5 osób przy pięciu cechach jest 100% rekordów, a po uogólnieniu 59.0%
Rysunek 3. Odsetek rekordów, które da się wyróżnić, gdy w zbiorze zostaje coraz więcej cech demograficznych (300 symulowanych osób z jednego wydziału). k to liczba osób o tej samej kombinacji cech. Uogólnienie: trzy przedziały wieku zamiast roku urodzenia, osobno tylko kierunki obejmujące co najmniej 10% próby, stopień studiów zamiast roku, województwo uczelni albo „inne”. Obliczenia: R (dane symulowane).

Zgoda uczestników i co zrobić, gdy surowych danych udostępnić nie wolno

O udostępnieniu danych decydujesz przed badaniem, nie po nim. Wytyczne NCN przypominają, że gdy w grę wchodzą dane osobowe, potrzebna jest świadoma zgoda uczestników na ich utrwalanie i udostępnianie, i każą rozważyć anonimizację lub pseudonimizację (Narodowe Centrum Nauki, 2020). Wpisz więc do informacji dla uczestników, że zanonimizowane dane trafią do publicznego repozytorium. Jeśli surowych danych udostępnić nie można, masz kilka możliwości:

  • podzbiór zanonimizowany – tylko zmienne potrzebne do analiz z artykułu, z uogólnionymi cechami demograficznymi;
  • dane zagregowane – macierze korelacji, średnie i odchylenia standardowe wystarczą do odtworzenia części analiz (np. regresji czy modeli SEM);
  • dane syntetyczne – zbiór, który zachowuje właściwości statystyczne i związki między zmiennymi, ale żaden rekord nie odpowiada prawdziwej osobie; Quintana (2020) pokazuje, jak go wygenerować i ocenić pakietem R synthpop;
  • dostęp kontrolowany – dane w repozytorium z kontrolą dostępu albo udostępniane przez komisję etyczną lub inną jednostkę instytucji, a nie wyłącznie przez autora (PLOS, b.d.).

Osobna sprawa to materiały: pełnej treści testów chronionych prawem autorskim nie umieszczaj w repozytorium bez zgody właściciela praw (zob. gdzie znaleźć kwestionariusze psychologiczne). Do pakietu wystarczą wtedy pełne odwołania i własne pytania z metryczki.

Licencje: CC0 i CC BY 4.0 dla danych, MIT i GPL dla kodu

Bez licencji inni nie wiedzą, co wolno im zrobić z Twoimi plikami. Wilson i in. (2017) przypominają, że brak licencji nie oznacza swobody: domyślnie autor zachowuje wszystkie prawa. Dla danych polecają CC0 albo CC BY, dla kodu – licencję permisywną, np. MIT.

Porównanie licencji CC0, CC BY 4.0, MIT i GPL-3.0 dla danych i kodu
LicencjaDla czegoCo wolno innymWarunek
CC0 1.0DaneWszystko, także w celach komercyjnych, bez pytania o zgodęBrak – to zrzeczenie się praw, nie licencja; cytowanie jest dobrym zwyczajem, a nie obowiązkiem
CC BY 4.0Dane, dokumentacja, materiałyKopiować, rozpowszechniać i zmieniać w dowolnym celuUznanie autorstwa: autorzy, link do licencji, informacja o zmianach
MITKodUżywać, kopiować, zmieniać, łączyć z innym kodem, rozpowszechniaćZachowanie informacji o prawach autorskich i tekstu licencji w kopiach
GPL-3.0KodUżywać, zmieniać i rozpowszechniaćCopyleft: rozpowszechniana zmieniona wersja musi być w całości udostępniona na tej samej licencji

W szablonie wybraliśmy CC BY 4.0 dla danych i MIT dla kodu – to zestaw zgodny z tymi zaleceniami. FAQ Creative Commons dodaje kilka praktycznych uwag (Creative Commons, b.d.):

  • licencje CC 4.0 obejmują także prawa sui generis do baz danych, a CC nie zaleca wariantów NC (bez użytku komercyjnego) i ND (bez utworów zależnych) dla baz danych przeznaczonych do użytku naukowego;
  • CC odradza licencje CC dla oprogramowania i poleca licencje uznane przez Free Software Foundation i Open Source Initiative – dlatego dane i kod mają osobne licencje;
  • licencje CC dotyczą praw autorskich, a nie prywatności, etyki badań ani ochrony danych osobowych – licencja nie zastępuje anonimizacji.

GPL wybierz, jeśli zależy Ci, by ulepszone wersje Twojego kodu też pozostały otwarte. Wilson i in. (2017) wolą licencje permisywne, bo taki kod łatwiej włączyć do innych projektów. Na OSF licencję wybiera się w metadanych projektu; komponenty mogą mieć różne licencje, więc dane i kod możesz trzymać w osobnych komponentach z osobnymi licencjami (Center for Open Science, b.d.).

OSF krok po kroku

OSF (Open Science Framework) to platforma Center for Open Science, w której projekt może mieć pliki, wiki, komponenty, licencję i DOI. Kroki poniżej opisują funkcje z oficjalnego przewodnika OSF Support (Center for Open Science, b.d.; stan na 16 października 2026 r.).

  1. Załóż projekt. Na pulpicie wybierz „Create new project”, wpisz tytuł i wybierz lokalizację przechowywania danych. Przewodnik wskazuje lokalizację w Niemczech jako opcję dla badaczy z UE ze względu na RODO. Lokalizację wybiera się tylko przy tworzeniu projektu – później nie da się jej zmienić.
  2. Podziel projekt na komponenty, np. „Dane”, „Kod”, „Materiały”. Każdy komponent ma własnych współpracowników, ustawienia prywatności, licencję i trwały identyfikator.
  3. Wgraj pliki w zakładce „Files” albo podłącz zewnętrzny magazyn (np. GitHub, Dropbox, Google Drive). Pliki w OSF Storage są wersjonowane. Limit to 5 GB dla projektu prywatnego i 50 GB dla publicznego (osobno dla każdego komponentu), a pojedynczy plik może mieć do 5 GB.
  4. Opisz projekt – w README w plikach i krótko w wiki (wiki ma historię zmian) oraz w metadanych: opis, słowa kluczowe, dziedzina, finansowanie.
  5. Wybierz licencję w sekcji „Metadata” (np. CC BY 4.0 dla danych i MIT dla kodu). Jeśli potrzebna licencja nie występuje na liście, wgraj plik license.txt i wybierz „Other”.
  6. Na czas recenzji utwórz link tylko do odczytu z opcją „Anonymize” – ukrywa nazwiska autorów, a osoba z linkiem może przeglądać i pobierać pliki, choć projekt pozostaje prywatny.
  7. Po akceptacji artykułu upublicznij projekt (projekty są domyślnie prywatne) i utwórz DOI: „Metadata”, „Edit” przy polu DOI, „Create”. DOI można nadać tylko projektowi publicznemu.
  8. Wpisz DOI projektu do artykułu – do deklaracji dostępności danych i do README.

Dwie przestrogi: usunięcia pliku albo projektu nie da się cofnąć, a projekt OSF można edytować także po publikacji (Center for Open Science, b.d.). Jeśli chcesz zamrozić stan plików w chwili wysłania artykułu, utwórz rejestrację projektu – jej, w odróżnieniu od projektu, nie można już zmienić (mechanizm rejestracji opisujemy we wpisie o prerejestracji na OSF).

Deklaracja dostępności danych – wzory PL i EN

Deklaracja dostępności danych (ang. data availability statement) mówi czytelnikowi, gdzie są dane i kod, na jakich warunkach i pod jakim identyfikatorem. PLOS wymaga w niej nazwy repozytorium i trwałego identyfikatora, a przy ograniczonym dostępie – opisu ograniczeń i instytucjonalnego punktu kontaktu. Autor nie może być jedyną osobą odpowiedzialną za dostęp (PLOS, b.d.). Pamiętaj o wynikach Gabelicy i in. (2022): sama formuła „na uzasadnioną prośbę” w praktyce rzadko kończy się udostępnieniem danych. Wybierz wariant, który pasuje do Twojej sytuacji.

Wariant A – dane i kod w otwartym repozytorium:

Dane, książka kodowa i skrypty R, które pozwalają odtworzyć wszystkie analizy, tabele i rysunki z artykułu, są dostępne w repozytorium OSF: [DOI]. Dane udostępniono na licencji CC BY 4.0, a kod na licencji MIT. Przed udostępnieniem z danych usunięto informacje pozwalające zidentyfikować uczestników (szczegóły w pliku README).
The data, codebook, and R scripts needed to reproduce all analyses, tables, and figures reported in this article are openly available on OSF at [DOI]. The data are shared under a CC BY 4.0 license and the code under the MIT license. Information that could identify participants was removed before sharing (see the README file for details).

Wariant B – dostęp kontrolowany przez instytucję:

Ze względu na [np. ryzyko identyfikacji uczestników w małej populacji / brak zgody uczestników na publiczne udostępnienie danych] dane nie mogą zostać udostępnione publicznie. Są dostępne dla badaczy spełniających kryteria dostępu do danych poufnych po złożeniu wniosku do [nazwa komisji etycznej lub jednostki instytucji, adres kontaktowy]. Kod analizy i książka kodowa są publicznie dostępne w repozytorium OSF: [DOI].
Because of [e.g., the risk of re-identifying participants in a small population / the lack of participant consent for public data sharing], the data cannot be shared publicly. They are available to researchers who meet the criteria for access to confidential data upon request to [name of the ethics committee or institutional body, contact address]. The analysis code and codebook are openly available on OSF at [DOI].

Wariant C – dane syntetyczne zamiast surowych:

Surowe dane nie mogą zostać udostępnione ze względu na [powód]. W repozytorium OSF ([DOI]) udostępniono zbiór syntetyczny, który zachowuje rozkłady zmiennych i związki między nimi, ale nie zawiera rekordów prawdziwych osób, oraz kod R, który na danych syntetycznych odtwarza wszystkie analizy z artykułu. Wyniki uzyskane na danych syntetycznych są zbliżone, ale nie identyczne z raportowanymi; zgodność oceniono w pliku [nazwa pliku].
The raw data cannot be shared because [reason]. A synthetic dataset that preserves the distributions of and relationships between variables, but contains no records of real participants, is available on OSF at [DOI], together with R code that reproduces all analyses reported in the article on the synthetic data. Results obtained on the synthetic data are close to, but not identical with, the reported results; their agreement is documented in [file name].

Test: czy obca osoba odtworzy wyniki w 30 minut?

Najlepszy sprawdzian pakietu to próba generalna, zanim zrobią ją recenzenci. Poproś osobę spoza zespołu – albo siebie na innym komputerze – o odtworzenie wyników z samym pakietem i README w ręku. Mierz czas.

  1. Pobierz pakiet z repozytorium (z linku z artykułu, nie z własnego dysku) i rozpakuj go do pustego folderu.
  2. Przeczytaj tylko README – bez pytania autorów.
  3. Zainstaluj potrzebne pakiety (renv::restore(), jeśli jest renv.lock).
  4. Uruchom skrypty w kolejności z README, w nowej sesji R.
  5. Porównaj wartości kontrolne z README, a potem tabele i rysunki z artykułem.
  6. Zapisz każde miejsce, w którym trzeba było zgadywać: brakujący plik, nieopisaną zmienną, ścieżkę z Twojego komputera, niejasny krok.

Jeśli całość zajęła więcej niż 30 minut albo choć jedna liczba się nie zgadza, popraw pakiet i powtórz test. Szablon z tego wpisu przeszedł taką próbę automatycznie: skrypt budujący archiwum rozpakowuje je do nowego folderu i uruchamia oba skrypty poleceniem Rscript. Pakiet przyda się też przy recenzji – prośba o dane i kod należy do typowych uwag (zob. najczęstsze zarzuty recenzentów do statystyki i wzory odpowiedzi w tekście odpowiedź recenzentom w sprawach statystycznych). W doktoracie, gdzie jeden zbiór danych zasila kilka artykułów, warto zaplanować pakiet od pierwszego badania (zob. analiza statystyczna w doktoracie).

Przykład reprodukowalny

Przykład w R: skrypty pakietu i symulacja ryzyka identyfikacji

Przepisy 1 i 2 to pełne skrypty z pliku pakiet-replikacyjny-szablon.zip. Wyniki pochodzą z testu „od zera”: archiwum rozpakowano do nowego, pustego folderu i oba skrypty uruchomiono poleceniem Rscript z katalogu głównego pakietu. Przepis 3 odtwarza symulację z rysunku 3.

1. 01_przygotowanie.R – od danych surowych do pliku analitycznego

Dane wejściowe: pliki pakietu: dane/surowe/badanie_surowe.csv (296 osób, dane symulowane) i codebook.csv; skrypt uruchamiasz z katalogu głównego pakietu.

Co odczytać: tabelę przepływu uczestników (ile osób wykluczono z każdego powodu) i liczebność grup w analizie; skrypt zatrzyma się błędem, jeśli plik nie zgadza się z książką kodową.

R
# 01_przygotowanie.R – od danych surowych do pliku analitycznego
# Pakiet replikacyjny: [tytuł artykułu]. Uruchamiaj z katalogu głównego pakietu
# (tam, gdzie leży README.md): Rscript 01_przygotowanie.R
# SPDX-License-Identifier: MIT

surowe  <- read.csv(file.path("dane", "surowe", "badanie_surowe.csv"),
                    stringsAsFactors = FALSE, encoding = "UTF-8")
ksiazka <- read.csv("codebook.csv", stringsAsFactors = FALSE, encoding = "UTF-8")

# 1. Zgodność z książką kodową: w pliku są dokładnie zmienne opisane jako „surowe”
opisane <- ksiazka$zmienna[grepl("surowe", ksiazka$plik)]
stopifnot(setequal(names(surowe), opisane), !anyDuplicated(surowe$id))

# 2. Kody braków (-99) zamieniamy na NA i sprawdzamy zakresy odpowiedzi
dane <- surowe
dane[dane == -99] <- NA
pozycje <- grep("^lek_(przed|po)_[0-9]$", names(dane), value = TRUE)
stopifnot(all(unlist(dane[c(pozycje, "kontrola")]) %in% c(1:5, NA)),
          all(dane$warunek %in% 0:1))

# 3. Pozycje odwrócone (książka kodowa): 6 - odpowiedź
odwrocone <- c("lek_po_2", "lek_po_5")
dane[odwrocone] <- 6 - dane[odwrocone]

# 4. Wyniki skal według planu analizy
przed <- paste0("lek_przed_", 1:3)
po    <- paste0("lek_po_", 1:6)
dane$lek_przed <- ifelse(rowSums(!is.na(dane[przed])) == 3, rowMeans(dane[przed]), NA)
dane$lek_po    <- ifelse(rowSums(!is.na(dane[po])) >= 5, rowMeans(dane[po], na.rm = TRUE), NA)

# 5. Reguły wykluczeń z planu, stosowane w tej kolejności
dane$powod <- NA_character_
dane$powod[is.na(dane$kontrola) | dane$kontrola != 2]           <- "błędne pytanie kontrolne"
dane$powod[is.na(dane$powod) & !is.na(dane$czas_s) & dane$czas_s < 120] <- "czas wypełnienia < 120 s"
dane$powod[is.na(dane$powod) & is.na(dane$lek_po)]               <- "braki w zmiennej zależnej"
dane$powod[is.na(dane$powod) & is.na(dane$lek_przed)]            <- "brak kowarianty"

# 6. Przepływ uczestników (do diagramu w artykule)
etapy <- c("błędne pytanie kontrolne", "czas wypełnienia < 120 s",
           "braki w zmiennej zależnej", "brak kowarianty")
przeplyw <- data.frame(etap = c("dane surowe", paste("wykluczeni:", etapy), "w analizie"),
                       n = c(nrow(dane), sapply(etapy, function(e) sum(dane$powod %in% e)),
                             sum(is.na(dane$powod))))
dir.create(file.path("wyniki", "tabele"), recursive = TRUE, showWarnings = FALSE)
write.csv(przeplyw, file.path("wyniki", "tabele", "przeplyw_uczestnikow.csv"), row.names = FALSE)

# 7. Plik analityczny
analiza <- dane[is.na(dane$powod), c("id", "warunek", "wiek_kat", "plec", "lek_przed", "lek_po")]
dir.create(file.path("dane", "przetworzone"), recursive = TRUE, showWarnings = FALSE)
write.csv(analiza, file.path("dane", "przetworzone", "badanie_analiza.csv"), row.names = FALSE)

print(przeplyw, row.names = FALSE)
cat("\nW analizie według warunku (0 = kontrola, 1 = ćwiczenie):\n")
print(table(analiza$warunek))
Wynik w R
                                  etap   n
                           dane surowe 296
  wykluczeni: błędne pytanie kontrolne  22
  wykluczeni: czas wypełnienia < 120 s   7
 wykluczeni: braki w zmiennej zależnej   3
           wykluczeni: brak kowarianty   2
                            w analizie 262

W analizie według warunku (0 = kontrola, 1 = ćwiczenie):

  0   1 
134 128 

2. 02_analiza.R – analizy z artykułu, tabele, rysunek i sessionInfo()

Dane wejściowe: plik dane/przetworzone/badanie_analiza.csv utworzony przez przepis 1.

Co odczytać: statystyki opisowe w grupach, wiersz warunek w modelu ANCOVA (hipoteza H1), d z bootstrapowym 95% CI (wynik zależy od set.seed(20261016)) i analizę wrażliwości testem Welcha.

R
# 02_analiza.R – analizy z artykułu (hipoteza H1) na pliku analitycznym
# Wymaga wyniku 01_przygotowanie.R. Uruchamiaj z katalogu głównego pakietu:
# Rscript 02_analiza.R
# SPDX-License-Identifier: MIT

dane <- read.csv(file.path("dane", "przetworzone", "badanie_analiza.csv"), stringsAsFactors = FALSE)
dir.create(file.path("wyniki", "tabele"), recursive = TRUE, showWarnings = FALSE)
dir.create(file.path("wyniki", "rysunki"), recursive = TRUE, showWarnings = FALSE)

# Tabela 1: statystyki opisowe w grupach
opisz <- function(d) data.frame(warunek = d$warunek[1], n = nrow(d),
                                M_przed = mean(d$lek_przed), SD_przed = sd(d$lek_przed),
                                M_po = mean(d$lek_po), SD_po = sd(d$lek_po))
tab1 <- do.call(rbind, lapply(split(dane, dane$warunek), opisz))
write.csv(tab1, file.path("wyniki", "tabele", "tabela1_opisowe.csv"), row.names = FALSE)

# Tabela 2: H1 – ANCOVA (lęk po ~ warunek + lęk przed), test dwustronny, alfa = .05
model <- lm(lek_po ~ warunek + lek_przed, data = dane)
wsp <- summary(model)$coefficients
tab2 <- data.frame(parametr = rownames(wsp), b = wsp[, 1], SE = wsp[, 2], t = wsp[, 3],
                   df = model$df.residual, p = wsp[, 4], CI_dolna = confint(model)[, 1],
                   CI_gorna = confint(model)[, 2])
write.csv(tab2, file.path("wyniki", "tabele", "tabela2_ancova.csv"), row.names = FALSE)

# Wielkość efektu: d = skorygowana różnica / łączne SD zmiennej zależnej,
# 95% CI z bootstrapu percentylowego (2000 prób losowanych w obrębie grup)
d_efekt <- function(d) {
  b <- coef(lm(lek_po ~ warunek + lek_przed, data = d))[["warunek"]]
  s <- tapply(d$lek_po, d$warunek, sd); n <- tapply(d$lek_po, d$warunek, length)
  b / sqrt(sum((n - 1) * s^2) / (sum(n) - 2))
}
set.seed(20261016)
grupy <- split(seq_len(nrow(dane)), dane$warunek)
boot_d <- replicate(2000, d_efekt(dane[unlist(lapply(grupy, function(i) sample(i, replace = TRUE))), ]))
efekt <- data.frame(d = d_efekt(dane), CI_dolna = quantile(boot_d, .025), CI_gorna = quantile(boot_d, .975))
write.csv(efekt, file.path("wyniki", "tabele", "tabela2_wielkosc_efektu.csv"), row.names = FALSE)

# Tabela 3: analiza wrażliwości z planu – test Welcha bez kowarianty
welch <- t.test(lek_po ~ warunek, data = dane)        # domyślnie test Welcha; różnica: grupa 0 - grupa 1
tab3 <- data.frame(roznica = unname(diff(welch$estimate)), t = -unname(welch$statistic),  # ćwiczenie - kontrola
                   df = unname(welch$parameter), p = welch$p.value,
                   CI_dolna = -welch$conf.int[2], CI_gorna = -welch$conf.int[1])
write.csv(tab3, file.path("wyniki", "tabele", "tabela3_wrazliwosc.csv"), row.names = FALSE)

# Rysunek: wyniki osób i średnie z 95% CI w grupach
png(file.path("wyniki", "rysunki", "rysunek1_lek_po.png"), width = 1600, height = 1100, res = 200)
stripchart(lek_po ~ warunek, data = dane, vertical = TRUE, method = "jitter", pch = 16,
           col = adjustcolor("grey40", 0.4), group.names = c("Kontrola", "Ćwiczenie"),
           ylab = "Lęk przed oceną po zadaniu (1–5)", ylim = c(1, 5))
srednie <- tapply(dane$lek_po, dane$warunek, mean)
pol <- tapply(dane$lek_po, dane$warunek, function(x) qt(.975, length(x) - 1) * sd(x) / sqrt(length(x)))
arrows(1:2, srednie - pol, 1:2, srednie + pol, angle = 90, code = 3, length = 0.08, lwd = 2, col = "red3")
points(1:2, srednie, pch = 19, cex = 1.6, col = "red3")
invisible(dev.off())

# Środowisko obliczeniowe (wersje R i pakietów)
writeLines(capture.output(sessionInfo()), file.path("wyniki", "sessionInfo.txt"))

# Podsumowanie w konsoli
print(round(tab1, 2), row.names = FALSE)
cat("\nH1 (ANCOVA):\n")
print(round(tab2[, -1], 3), row.names = TRUE)
cat("\nWielkość efektu d [95% CI bootstrap]:\n")
print(round(efekt, 2), row.names = FALSE)
cat("\nAnaliza wrażliwości (test Welcha, różnica: ćwiczenie - kontrola):\n")
print(round(tab3, 3), row.names = FALSE)
Wynik w R
 warunek   n M_przed SD_przed M_po SD_po
       0 134    2.92     0.87 2.93  0.81
       1 128    3.00     0.86 2.69  0.87

H1 (ANCOVA):
                 b    SE      t  df     p CI_dolna CI_gorna
(Intercept)  1.728 0.172 10.058 259 0.000    1.389    2.066
warunek     -0.277 0.094 -2.954 259 0.003   -0.462   -0.092
lek_przed    0.412 0.054  7.581 259 0.000    0.305    0.519

Wielkość efektu d [95% CI bootstrap]:
     d CI_dolna CI_gorna
 -0.33    -0.56    -0.11

Analiza wrażliwości (test Welcha, różnica: ćwiczenie - kontrola):
 roznica      t      df    p CI_dolna CI_gorna
  -0.244 -2.349 256.353 0.02   -0.448   -0.039

3. Ryzyko identyfikacji: rekordy unikatowe po dodaniu kolejnych cech (rysunek 3)

Dane wejściowe: brak – dane symulowane (set.seed(4242)): 300 osób z jednego wydziału z pięcioma cechami demograficznymi.

Co odczytać: kolumna unikatowe to odsetek osób, których kombinacja cech jest jedyna w zbiorze (k = 1), a k_ponizej_5 – odsetek osób w grupach mniejszych niż 5 osób, dla dokładnych i uogólnionych wartości cech.

R
# B41 – przepis 3: ile rekordów staje się unikatowych, gdy dokładamy cechy demograficzne?
# Wpis: /blog/pakiet-replikacyjny-dane-i-kod-osf/ (sekcja o anonimizacji, rysunek 3)
# Uruchomienie: LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 Rscript b41-reidentyfikacja.R
# Dane symulowane: 300 osób badanych z jednego wydziału, bez imion, adresów e-mail i numerów.

set.seed(4242)
N <- 300
dane <- data.frame(
  plec = sample(c("K", "M", "inna"), N, TRUE, c(.64, .34, .02)),
  rok_ur = 2026 - sample(19:32, N, TRUE, c(.10, .15, .17, .16, .13, .09, .06, .04, .03, .02, .02, .01, .01, .01)),
  kierunek = sample(paste0("kierunek_", 1:8), N, TRUE, c(.28, .20, .14, .12, .10, .07, .05, .04)),
  rok_st = sample(1:5, N, TRUE, c(.27, .24, .21, .16, .12)),
  woj = sample(paste0("woj_", 1:16), N, TRUE,
               c(.55, .12, .08, .06, .04, .03, .02, .02, .015, .015, .01, .01, .01, .01, .005, .005)))

# Wersja po uogólnieniu: przedziały wieku, duże kierunki, stopień studiów, województwo uczelni
duze <- names(which(prop.table(table(dane$kierunek)) >= .10))
uogolnione <- data.frame(
  plec = dane$plec,
  rok_ur = cut(2026 - dane$rok_ur, c(0, 21, 24, Inf), labels = c("do 21 lat", "22–24", "25+")),
  kierunek = ifelse(dane$kierunek %in% duze, dane$kierunek, "inny"),
  rok_st = ifelse(dane$rok_st <= 3, "I stopień", "II stopień"),
  woj = ifelse(dane$woj == "woj_1", "to samo co uczelnia", "inne"))

# k = liczba osób z tą samą kombinacją cech (k = 1: rekord unikatowy)
ryzyko <- function(d, cechy) {
  k <- ave(rep(1, nrow(d)), do.call(paste, c(d[cechy], sep = "|")), FUN = length)
  c(unikatowe = 100 * mean(k == 1), k_ponizej_5 = 100 * mean(k < 5))
}
zestawy <- list("płeć" = "plec", "+ rok urodzenia" = c("plec", "rok_ur"),
                "+ kierunek" = c("plec", "rok_ur", "kierunek"),
                "+ rok studiów" = c("plec", "rok_ur", "kierunek", "rok_st"),
                "+ województwo" = c("plec", "rok_ur", "kierunek", "rok_st", "woj"))
wynik <- do.call(rbind, lapply(names(zestawy), function(z)
  data.frame(cechy = z, rbind(dokladne = ryzyko(dane, zestawy[[z]]),
                              uogolnione = ryzyko(uogolnione, zestawy[[z]])),
             wersja = c("dokładne wartości", "po uogólnieniu"))))
rownames(wynik) <- NULL
print(transform(wynik, unikatowe = round(unikatowe, 1), k_ponizej_5 = round(k_ponizej_5, 1)), row.names = FALSE)
saveRDS(wynik, "b41-reidentyfikacja.rds")     # do rysunku 3
Wynik w R
           cechy unikatowe k_ponizej_5            wersja
            płeć       0.0         0.0 dokładne wartości
            płeć       0.0         0.0    po uogólnieniu
 + rok urodzenia       1.7         9.3 dokładne wartości
 + rok urodzenia       0.0         2.7    po uogólnieniu
      + kierunek      23.0        62.7 dokładne wartości
      + kierunek       2.3         6.3    po uogólnieniu
   + rok studiów      55.7        98.0 dokładne wartości
   + rok studiów       4.7        31.7    po uogólnieniu
   + województwo      82.7       100.0 dokładne wartości
   + województwo      12.3        59.0    po uogólnieniu

Bibliografia oprogramowania

Wyniki na tej stronie pochodzą z uruchomienia pokazanego kodu w R 4.5.3. Skrypty pakietu korzystają wyłącznie z pakietów wbudowanych w R; rysunki przygotowano w pakiecie ggplot2, a plik ZIP zbudowano pakietem zip. W pracy podaj wersje faktycznie użytych pakietów (sessionInfo()).

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
  2. ggplot2 (wersja 4.0.2): Wickham, H. (2016). ggplot2: Elegant graphics for data analysis. Springer. https://ggplot2.tidyverse.org
  3. zip (wersja 2.3.3): Csárdi, G. (2025). zip: Cross-platform 'zip' compression [R package]. https://doi.org/10.32614/CRAN.package.zip

Najczęstsze błędy

  • „Dane dostępne na prośbę” zamiast repozytorium. Bez trwałego identyfikatora i instytucjonalnego punktu kontaktu dane zwykle przepadają.
  • Ścieżki bezwzględne i setwd(). Kod działa tylko na komputerze autora.
  • Ręcznie poprawiony plik danych. Zmiany w Excelu bez śladu w kodzie uniemożliwiają odtworzenie przygotowania danych (do czego Excel się nadaje, a do czego nie, piszemy w poradniku analiza statystyczna w Excelu).
  • Brak książki kodowej. Nikt nie wie, co znaczy q17_r ani jak zakodowano braki.
  • Brak ziarna i wersji pakietów. Bootstrap daje inne przedziały, a nowa wersja pakietu – inne domyślne ustawienia.
  • Pseudonimizacja wzięta za anonimizację. Kod zamiast nazwiska nie wystarcza, jeśli w pliku zostały wiek, kierunek, rok studiów i miejscowość.
  • Jedna licencja na wszystko – albo żadna.
  • Pakiet przygotowany po przyjęciu artykułu. Odtworzenie decyzji sprzed roku jest trudniejsze niż zapisanie ich na bieżąco.

Lista kontrolna przed publikacją pakietu

  • README odpowiada na pytania: co to jest, jak uruchomić, jak cytować; zawiera wartości kontrolne.
  • Każda zmienna (także wyliczona) ma wiersz w książce kodowej.
  • Dane są w otwartym formacie (CSV, UTF-8), a dane surowe nie zmieniły się od zebrania (poza anonimizacją).
  • Usunięto identyfikatory bezpośrednie; identyfikatory pośrednie ograniczono do potrzebnych analiz.
  • Uczestnicy zostali poinformowani o udostępnieniu danych, a plan zaakceptowała komisja etyczna.
  • Skrypty używają ścieżek względnych, mają ziarno i zapisują sessionInfo(); wersje pakietów są w renv.lock.
  • Pakiet przeszedł test „od zera” w pustym folderze.
  • Dane i kod mają licencje, wybrane także w metadanych repozytorium.
  • Projekt jest publiczny i ma DOI; DOI jest w artykule i w README.
  • Deklaracja dostępności danych wskazuje repozytorium, identyfikator i warunki dostępu.

Najczęstsze pytania

Jak napisać deklarację dostępności danych do artykułu?

Podaj, gdzie są dane i kod (nazwa repozytorium), ich trwały identyfikator (np. DOI), licencje i warunki dostępu. Jeśli danych nie wolno upublicznić, opisz powód i wskaż instytucjonalny punkt kontaktu, np. komisję etyczną – PLOS nie akceptuje autora jako jedynej osoby odpowiedzialnej za dostęp. Samo „dostępne na uzasadnioną prośbę” rzadko działa: w badaniu Gabelicy i in. (2022) dane przekazało 6.8% autorów, którzy to zadeklarowali.

Czy mogę udostępnić dane z ankiety, w której zbierałem dane osobowe?

Publicznie – tylko dane zanonimizowane, czyli takie, które nie pozwalają zidentyfikować osób przy użyciu rozsądnie prawdopodobnych sposobów; według motywu 26 RODO takie informacje nie podlegają rozporządzeniu, ale dane spseudonimizowane nadal są danymi osobowymi. Usuń identyfikatory bezpośrednie, ogranicz pośrednie (wiek, kierunek, miejscowość) i poinformuj uczestników o udostępnieniu danych przed badaniem. Plan skonsultuj z komisją etyczną i inspektorem ochrony danych; to nie jest porada prawna.

Jaką licencję wybrać dla danych badawczych i kodu?

Dla danych zwykle poleca się CC BY 4.0 (wymaga uznania autorstwa) albo CC0 (zrzeczenie się praw), dla kodu – licencję permisywną, np. MIT, albo GPL-3.0, jeśli zmienione wersje mają pozostać otwarte (Wilson i in., 2017). Creative Commons odradza swoje licencje dla oprogramowania i nie zaleca wariantów NC i ND dla naukowych baz danych. Pamiętaj, że licencja nie zastępuje anonimizacji.

Ile miejsca daje OSF na pliki projektu?

Według przewodnika OSF limit OSF Storage to 5 GB dla projektu prywatnego i 50 GB dla publicznego, liczony osobno dla każdego komponentu, a pojedynczy plik może mieć do 5 GB. Pliki w podłączonych magazynach zewnętrznych (np. GitHub, Dropbox) nie wliczają się do limitu. Lokalizację przechowywania, np. w Niemczech, wybiera się przy zakładaniu projektu i nie można jej później zmienić.

Co powinien zawierać plik README do pakietu replikacyjnego?

Tytuł i autorów z kontaktem, odwołanie do artykułu i prerejestracji, listę plików, instrukcję uruchomienia (kolejność skryptów, wersja programu), opis danych (liczebność, książka kodowa, kody braków, co usunięto przy anonimizacji), opis środowiska (sessionInfo, renv.lock, ziarno), licencje i sposób cytowania. Dobrym zwyczajem są wartości kontrolne, np. jeden współczynnik z tabeli, który osoba odtwarzająca wyniki powinna otrzymać.

Czy NCN wymaga udostępniania danych z projektów?

Tak – od 2019 r. wnioski do NCN zawierają plan zarządzania danymi oceniany przez ekspertów, a po zmianach z 26 czerwca 2025 r. zasady udostępniania danych badawczych pozostały bez zmian, mimo że publikowanie w otwartym dostępie nie jest już obowiązkowe. Według wytycznych NCN dane należy udostępnić najpóźniej w momencie publikacji wyników i przechowywać co najmniej 10 lat. Przed złożeniem wniosku sprawdź dokumenty swojego konkursu.

Powiązane hasła

Przeczytaj też

Potrzebujesz kodu, który odtworzy wyniki Twojego artykułu?

Przygotujemy albo sprawdzimy skrypty R, książkę kodową i README tak, by analizy z artykułu dało się uruchomić od zera na danych z repozytorium.

Oferta dla badaczyPorozmawiaj o projekcie

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Center for Open Science. (b.d.). Welcome to OSF projects. OSF Support. Pobrano 16 października 2026 z https://help.osf.io/article/137-osf-storage-caps ● Otwarty dostęp
  2. Creative Commons. (b.d.). Frequently asked questions. Pobrano 16 października 2026 z https://creativecommons.org/faq/ ● Otwarty dostęp
  3. Gabelica, M., Bojčić, R., & Puljak, L. (2022). Many researchers were not compliant with their published data sharing statement: A mixed-methods study. Journal of Clinical Epidemiology, 150, 33–41. https://doi.org/10.1016/j.jclinepi.2022.05.019
  4. Hardwicke, T. E., Mathur, M. B., MacDonald, K., Nilsonne, G., Banks, G. C., Kidwell, M. C., Hofelich Mohr, A., Clayton, E., Yoon, E. J., Henry Tessler, M., Lenne, R. L., Altman, S., Long, B., & Frank, M. C. (2018). Data availability, reusability, and analytic reproducibility: Evaluating the impact of a mandatory open data policy at the journal Cognition. Royal Society Open Science, 5(8), Article 180448. https://doi.org/10.1098/rsos.180448 ● Otwarty dostęp
  5. Narodowe Centrum Nauki. (2020). Wytyczne dla wnioskodawców do uzupełnienia planu zarządzania danymi w projekcie badawczym. https://www.ncn.gov.pl/sites/default/files/pliki/regulaminy/wytyczne_zarzadzanie_danymi_06_2020.pdf ● Otwarty dostęp
  6. Narodowe Centrum Nauki. (b.d.). Otwarta nauka. Pobrano 16 października 2026 z https://www.ncn.gov.pl/finansowanie-nauki/otwarta-nauka ● Otwarty dostęp
  7. Obels, P., Lakens, D., Coles, N. A., Gottfried, J., & Green, S. A. (2020). Analysis of open data and computational reproducibility in registered reports in psychology. Advances in Methods and Practices in Psychological Science, 3(2), 229–237. https://doi.org/10.1177/2515245920918872 ● Otwarty dostęp
  8. Parlament Europejski i Rada Unii Europejskiej. (2016). Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (ogólne rozporządzenie o ochronie danych). Dziennik Urzędowy Unii Europejskiej. https://eur-lex.europa.eu/eli/reg/2016/679/oj ● Otwarty dostęp: pełny tekst
  9. PLOS. (b.d.). Data availability. PLOS One. Pobrano 16 października 2026 z https://journals.plos.org/plosone/s/data-availability ● Otwarty dostęp
  10. Quintana, D. S. (2020). A synthetic dataset primer for the biobehavioural sciences to promote reproducibility and hypothesis generation. eLife, 9, Article e53275. https://doi.org/10.7554/elife.53275 ● Otwarty dostęp
  11. Rocher, L., Hendrickx, J. M., & de Montjoye, Y.-A. (2019). Estimating the success of re-identifications in incomplete datasets using generative models. Nature Communications, 10(1), Article 3069. https://doi.org/10.1038/s41467-019-10933-3 ● Otwarty dostęp
  12. Trisovic, A., Lau, M. K., Pasquier, T., & Crosas, M. (2022). A large-scale study on research code quality and execution. Scientific Data, 9(1), Article 60. https://doi.org/10.1038/s41597-022-01143-6 ● Otwarty dostęp
  13. Wilkinson, M. D., Dumontier, M., Aalbersberg, I. J., Appleton, G., Axton, M., Baak, A., Blomberg, N., Boiten, J.-W., da Silva Santos, L. B., Bourne, P. E., Bouwman, J., Brookes, A. J., Clark, T., Crosas, M., Dillo, I., Dumon, O., Edmunds, S., Evelo, C. T., Finkers, R., . . . Mons, B. (2016). The FAIR Guiding Principles for scientific data management and stewardship. Scientific Data, 3(1), Article 160018. https://doi.org/10.1038/sdata.2016.18 ● Otwarty dostęp
  14. Wilson, G., Bryan, J., Cranston, K., Kitzes, J., Nederbragt, L., & Teal, T. K. (2017). Good enough practices in scientific computing. PLOS Computational Biology, 13(6), Article e1005510. https://doi.org/10.1371/journal.pcbi.1005510 ● Otwarty dostęp

Cytowania BibTeX

@misc{cosndprojekty, author={{Center for Open Science}}, title={{Welcome to OSF projects}}, howpublished={OSF Support}, url={https://help.osf.io/article/137-osf-storage-caps}}
@misc{creativecommonsndfaq, author={{Creative Commons}}, title={{Frequently asked questions}}, url={https://creativecommons.org/faq/}}
@article{gabelica2022many, author={Gabelica, Mirko and Bojčić, Ružica and Puljak, Livia}, title={{Many researchers were not compliant with their published data sharing statement: A mixed-methods study}}, journal={Journal of Clinical Epidemiology}, year={2022}, volume={150}, pages={33--41}, doi={10.1016/j.jclinepi.2022.05.019}}
@article{hardwicke2018data, author={Hardwicke, Tom E. and Mathur, Maya B. and MacDonald, Kyle and Nilsonne, Gustav and Banks, George C. and Kidwell, Mallory C. and Hofelich Mohr, Alicia and Clayton, Elizabeth and Yoon, Erica J. and Henry Tessler, Michael and Lenne, Richie L. and Altman, Sara and Long, Bria and Frank, Michael C.}, title={{Data availability, reusability, and analytic reproducibility: Evaluating the impact of a mandatory open data policy at the journal Cognition}}, journal={Royal Society Open Science}, year={2018}, volume={5}, number={8}, eid={180448}, doi={10.1098/rsos.180448}}
@techreport{ncn2020wytyczne, author={{Narodowe Centrum Nauki}}, title={{Wytyczne dla wnioskodawców do uzupełnienia planu zarządzania danymi w projekcie badawczym}}, year={2020}, url={https://www.ncn.gov.pl/sites/default/files/pliki/regulaminy/wytyczne_zarzadzanie_danymi_06_2020.pdf}}
@misc{ncnndotwarta, author={{Narodowe Centrum Nauki}}, title={{Otwarta nauka}}, url={https://www.ncn.gov.pl/finansowanie-nauki/otwarta-nauka}}
@article{obels2020analysis, author={Obels, Pepijn and Lakens, Daniël and Coles, Nicholas A. and Gottfried, Jaroslav and Green, Seth A.}, title={{Analysis of open data and computational reproducibility in registered reports in psychology}}, journal={Advances in Methods and Practices in Psychological Science}, year={2020}, volume={3}, number={2}, pages={229--237}, doi={10.1177/2515245920918872}}
@misc{eu2016regulation, author={{Parlament Europejski i Rada Unii Europejskiej}}, title={{Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (ogólne rozporządzenie o ochronie danych)}}, howpublished={Dziennik Urzędowy Unii Europejskiej}, year={2016}, volume={L 119}, pages={1--88}, url={https://eur-lex.europa.eu/eli/reg/2016/679/oj}}
@misc{plosndda, author={{PLOS}}, title={{Data availability}}, howpublished={PLOS One}, url={https://journals.plos.org/plosone/s/data-availability}}
@article{quintana2020synthetic, author={Quintana, Daniel S}, title={{A synthetic dataset primer for the biobehavioural sciences to promote reproducibility and hypothesis generation}}, journal={eLife}, year={2020}, volume={9}, eid={e53275}, doi={10.7554/elife.53275}}
@article{rocher2019estimating, author={Rocher, Luc and Hendrickx, Julien M. and de Montjoye, Yves-Alexandre}, title={{Estimating the success of re-identifications in incomplete datasets using generative models}}, journal={Nature Communications}, year={2019}, volume={10}, number={1}, eid={3069}, doi={10.1038/s41467-019-10933-3}}
@article{trisovic2022large, author={Trisovic, Ana and Lau, Matthew K. and Pasquier, Thomas and Crosas, Mercè}, title={{A large-scale study on research code quality and execution}}, journal={Scientific Data}, year={2022}, volume={9}, number={1}, eid={60}, doi={10.1038/s41597-022-01143-6}}
@article{wilkinson2016fair, author={Wilkinson, Mark D. and Dumontier, Michel and Aalbersberg, IJsbrand Jan and Appleton, Gabrielle and Axton, Myles and Baak, Arie and Blomberg, Niklas and Boiten, Jan-Willem and da Silva Santos, Luiz Bonino and Bourne, Philip E. and Bouwman, Jildau and Brookes, Anthony J. and Clark, Tim and Crosas, Mercè and Dillo, Ingrid and Dumon, Olivier and Edmunds, Scott and Evelo, Chris T. and Finkers, Richard and Gonzalez-Beltran, Alejandra and Gray, Alasdair J.G. and Groth, Paul and Goble, Carole and Grethe, Jeffrey S. and Heringa, Jaap and ’t Hoen, Peter A.C and Hooft, Rob and Kuhn, Tobias and Kok, Ruben and Kok, Joost and Lusher, Scott J. and Martone, Maryann E. and Mons, Albert and Packer, Abel L. and Persson, Bengt and Rocca-Serra, Philippe and Roos, Marco and van Schaik, Rene and Sansone, Susanna-Assunta and Schultes, Erik and Sengstag, Thierry and Slater, Ted and Strawn, George and Swertz, Morris A. and Thompson, Mark and van der Lei, Johan and van Mulligen, Erik and Velterop, Jan and Waagmeester, Andra and Wittenburg, Peter and Wolstencroft, Katherine and Zhao, Jun and Mons, Barend}, title={{The FAIR Guiding Principles for scientific data management and stewardship}}, journal={Scientific Data}, year={2016}, volume={3}, number={1}, eid={160018}, doi={10.1038/sdata.2016.18}}
@article{wilson2017good, author={Wilson, Greg and Bryan, Jennifer and Cranston, Karen and Kitzes, Justin and Nederbragt, Lex and Teal, Tracy K.}, title={{Good enough practices in scientific computing}}, journal={PLOS Computational Biology}, year={2017}, volume={13}, number={6}, eid={e1005510}, doi={10.1371/journal.pcbi.1005510}}
R