Słownik metodologiczny · Open science i wnioskowanie

P-curve – jak sprawdzić, czy zestaw badań ma wartość dowodową?

P-curve to rozkład istotnych wartości p w zestawie badań. Prawoskośna krzywa świadczy o prawdziwym efekcie, płaska – o samym selektywnym raportowaniu. Pokazujemy logikę, testy, przykład w R i pułapki.

W skrócie: P-curve to rozkład istotnych wartości p (p < .05) w zestawie badań. Gdy efekt istnieje, krzywa jest prawoskośna (więcej p ok. .01 niż ok. .04); płaska lub lewoskośna sugeruje, że wyniki mogą wynikać z samego błędu publikacji i p-hackingu.

Co to jest p-curve?

P-curve (krzywa p) to rozkład istotnych statystycznie wartości p (p < .05) z zestawu badań i metoda jego analizy (Simonsohn i in., 2014). Odpowiada na pytanie, czy wyniki mają wartość dowodową, czy da się je wyjaśnić samym selektywnym raportowaniem: błędem publikacji i p-hackingiem.

Logika metody

Gdy efektu nie ma, wartości p mają rozkład jednostajny, więc istotne wyniki rozkładają się równo między .00 a .05 – krzywa jest płaska. Gdy efekt istnieje, wartości bliskich .01 jest więcej niż bliskich .04 – krzywa jest prawoskośna. P-hacking zatrzymuje się tuż pod progiem, więc spłaszcza krzywą albo przechyla ją w lewo. Metoda korzysta tylko z wyników istotnych, więc nie potrzebuje badań z szuflady.

Każde p zamienia się na pp-wartość (p/.05), a pp-wartości łączy się metodą Stouffera. Istotnie ujemne Z oznacza prawoskośność. Drugi test sprawdza, czy krzywa jest bardziej płaska niż przy mocy 33%. Jeśli tak, wartość dowodowa jest niewystarczająca (Simonsohn i in., 2015).

Przykład

W symulowanej literaturze o prawdziwym d = 0.20 było 26 istotnych wyników: 14 miało p < .01, a tylko jeden leżał między .04 a .05. Test prawoskośności: Z = −4.28, p < .001. W drugim zbiorze prawdziwy efekt wynosił zero: z 300 badań istotnych i dodatnich było 12, Z = −0.41, p = .341, a test płaskości wobec mocy 33% znalazł się na granicy, p = .0497.

Jak opisać w pracy

Analiza p-curve (Simonsohn i in., 2014) objęła 26 istotnych wyników. Rozkład wartości p był prawoskośny, Z = −4.28, p < .001, co wskazuje, że zestaw badań ma wartość dowodową i nie wynika wyłącznie z selektywnego raportowania.

Na co uważać

  • Dobór wartości p. Z każdego badania bierze się jedno p dla hipotezy autorów, a wyniki muszą być niezależne. Błędy w doborze wartości p mogą zniekształcić wynik analizy (Simonsohn i in., 2015).
  • Mało wyników. Przy kilkunastu istotnych p oba testy mają małą moc.
  • Wartość dowodowa to nie wielkość efektu. Prawoskośna krzywa mówi, że efekt istnieje, ale nie mówi, jak jest duży. Do korekty efektu łącznego służą m.in. PET-PEESE i model selekcji.

Zestawienie metod pokazuje wpis Błąd publikacji w metaanalizie.

Przykład reprodukowalny

P-curve w R

Pakiet do p-curve nie jest potrzebny: funkcja pcurve() liczy pp-wartości, test prawoskośności Stouffera i test płaskości wobec mocy 33% dla testów z. Kod porównuje literaturę z prawdziwym efektem i literaturę bez efektu.

Test prawoskośności i płaskości dla dwóch symulowanych literatur

Dane wejściowe: dwa zbiory z funkcji gen() (15–100 osób w grupie, τ = 0.10, publikacja wszystkich wyników istotnych i dodatnich oraz 15% pozostałych): 120 badań o d = 0.20 (set.seed(387)) i 300 badań o d = 0 (set.seed(388)).

Co odczytać: liczbę istotnych wyników k, Z i p testu prawoskośności (Z_prawo, p_prawo) i testu płaskości (Z_33, p_33) oraz rozkład istotnych p w przedziałach co .01.

R
suppressPackageStartupMessages(library(metafor))
gen <- function(d, k) {                       # k badań; d – prawdziwy efekt (tau = 0.10)
  n  <- sample(15:100, k, replace = TRUE)     # osób w grupie
  yi <- sapply(n, function(m) { a <- rnorm(m, rnorm(1, d, 0.10)); b <- rnorm(m)
                                (mean(a) - mean(b)) / sqrt((var(a) + var(b)) / 2) })
  dat <- data.frame(n = n, yi = yi, vi = 2 / n + yi^2 / (4 * n))
  dat$sei <- sqrt(dat$vi)
  dat$p   <- 2 * pnorm(abs(dat$yi / dat$sei), lower.tail = FALSE)  # p dwustronne
  dat[(dat$p < .05 & dat$yi > 0) | runif(k) < .15, ]                 # „publikacja”
}
pcurve <- function(dat) {                     # tylko istotne wyniki w oczekiwanym kierunku
  s  <- dat[dat$p < .05 & dat$yi > 0, ]
  z  <- s$yi / s$sei
  pp <- s$p / .05                             # pp-wartości przy H0: brak efektu
  ncp <- qnorm(.975) - qnorm(2/3)             # moc 33% (test z)
  pp33 <- 3 * pnorm(z, ncp, lower.tail = FALSE)
  Zr <- sum(qnorm(pp)) / sqrt(nrow(s))        # prawoskośność (Stouffer)
  Zf <- sum(qnorm(pp33)) / sqrt(nrow(s))      # płaskość wobec mocy 33%
  c(k = nrow(s), Z_prawo = Zr, p_prawo = pnorm(Zr),
    Z_33 = Zf, p_33 = pnorm(Zf, lower.tail = FALSE))
}
set.seed(387); dat <- gen(0.2, 120)           # prawdziwe d = 0.2
set.seed(388); d0  <- gen(0, 300)             # prawdziwe d = 0
round(rbind(efekt = pcurve(dat), zero = pcurve(d0)), 4)
s <- dat[dat$p < .05 & dat$yi > 0, ]
table(cut(s$p, seq(0, .05, .01)))             # rozkład istotnych p
s0 <- d0[d0$p < .05 & d0$yi > 0, ]
table(cut(s0$p, seq(0, .05, .01)))
Wynik w R
       k Z_prawo p_prawo    Z_33   p_33
efekt 26 -4.2763  0.0000 -0.7491 0.7731
zero  12 -0.4094  0.3411  1.6477 0.0497

   (0,0.01] (0.01,0.02] (0.02,0.03] (0.03,0.04] (0.04,0.05]
         14           5           4           2           1

   (0,0.01] (0.01,0.02] (0.02,0.03] (0.03,0.04] (0.04,0.05]
          5           2           2           0           3

Bibliografia oprogramowania

Wyniki pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (pakiet metafor). 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. metafor (wersja 5.0.1): Viechtbauer, W. (2010). Conducting meta-analyses in R with the metafor package. Journal of Statistical Software, 36(3), 1–48. https://doi.org/10.18637/jss.v036.i03

Najczęstsze pytania

Co oznacza prawoskośna p-curve?

Że wśród istotnych wyników jest więcej bardzo małych wartości p (ok. .01) niż bliskich progu (ok. .04). Taki rozkład powstaje, gdy efekt istnieje, więc zestaw badań ma wartość dowodową.

Czy p-curve wymaga nieopublikowanych badań?

Nie. Analiza korzysta wyłącznie z wyników istotnych, czyli tych, które zwykle są publikowane. To jej przewaga nad metodami potrzebującymi pełnego lejka badań.

Jak policzyć p-curve w R?

Wystarczy kilka linijek: pp-wartość to p/.05, a test prawoskośności to pnorm(sum(qnorm(pp)) / sqrt(k)). Test płaskości wymaga pp-wartości liczonych przy mocy 33% – pełny kod jest w przykładzie.

Powiązane hasła

Poradniki, w których użyjesz tego pojęcia

Potrzebujesz wsparcia w analizie danych?

Wybierz ofertę dopasowaną do pracy dyplomowej albo profesjonalnego projektu naukowego.

Wyceń analizęOferta dla studentów

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Simonsohn, U., Nelson, L. D., & Simmons, J. P. (2014). P-curve: A key to the file-drawer. Journal of Experimental Psychology: General, 143(2), 534–547. https://doi.org/10.1037/a0033242
  2. Simonsohn, U., Simmons, J. P., & Nelson, L. D. (2015). Better P-curves: Making P-curve analysis more robust to errors, fraud, and ambitious P-hacking, a reply to Ulrich and Miller (2015). Journal of Experimental Psychology: General, 144(6), 1146–1152. https://doi.org/10.1037/xge0000104 ● Otwarty dostęp: pełny tekst

Cytowania BibTeX

@article{simonsohn2014pcurve, author={Simonsohn, Uri and Nelson, Leif D. and Simmons, Joseph P.}, title={{P-curve: A key to the file-drawer}}, journal={Journal of Experimental Psychology: General}, year={2014}, volume={143}, number={2}, pages={534--547}, doi={10.1037/a0033242}}
@article{simonsohn2015better, author={Simonsohn, Uri and Simmons, Joseph P. and Nelson, Leif D.}, title={{Better P-curves: Making P-curve analysis more robust to errors, fraud, and ambitious P-hacking, a reply to Ulrich and Miller (2015)}}, journal={Journal of Experimental Psychology: General}, year={2015}, volume={144}, number={6}, pages={1146--1152}, doi={10.1037/xge0000104}}
R