Bagaimana cara mendapatkan nilai-p yang dikumpulkan pada tes yang dilakukan dalam beberapa dataset imputed?

11

Dengan menggunakan Amelia di R, saya memperoleh beberapa dataset yang terkait. Setelah itu, saya melakukan tes tindakan berulang di SPSS. Sekarang, saya ingin menggabungkan hasil tes. Saya tahu bahwa saya dapat menggunakan aturan Rubin (diimplementasikan melalui beberapa paket imputasi dalam R) untuk menyatukan sarana dan kesalahan standar, tetapi bagaimana cara menyatukan nilai-p? Apa itu mungkin? Apakah ada fungsi dalam R untuk melakukannya? Terima kasih sebelumnya.

wisc88
sumber
Anda mungkin ingin memeriksa informasi tentang meta-analisis p-value. Satu titik awal yang baik: en.wikipedia.org/wiki/Fisher%27s_method
user29889

Jawaban:

13

Ya , itu mungkin dan, ya, ada Rfungsi yang melakukannya. Alih-alih menghitung p-nilai dari analisis diulang dengan tangan, Anda dapat menggunakan paket Zelig, yang juga disebut dalam sketsa dari Amelia-Paket ( untuk metode yang lebih informatif lihat update saya di bawah ). Saya akan menggunakan contoh dari Amelia-vignette untuk mendemonstrasikan ini:

library("Amelia")
data(freetrade)
amelia.out <- amelia(freetrade, m = 15, ts = "year", cs = "country")

library("Zelig")
zelig.fit <- zelig(tariff ~ pop + gdp.pc + year + polity, data = amelia.out$imputations, model = "ls", cite = FALSE)
summary(zelig.fit)

Ini adalah output yang sesuai termasuk nilai- :hal

  Model: ls
  Number of multiply imputed data sets: 15 

Combined results:

Call:
lm(formula = formula, weights = weights, model = F, data = data)

Coefficients:
                Value Std. Error t-stat  p-value
(Intercept)  3.18e+03   7.22e+02   4.41 6.20e-05
pop          3.13e-08   5.59e-09   5.59 4.21e-08
gdp.pc      -2.11e-03   5.53e-04  -3.81 1.64e-04
year        -1.58e+00   3.63e-01  -4.37 7.11e-05
polity       5.52e-01   3.16e-01   1.75 8.41e-02

For combined results from datasets i to j, use summary(x, subset = i:j).
For separate results, use print(summary(x), subset = i:j).

zeligdapat memuat sejumlah model selain kuadrat terkecil.

Untuk mendapatkan interval kepercayaan dan derajat kebebasan untuk perkiraan Anda, Anda dapat menggunakan mitools:

library("mitools")
imp.data <- imputationList(amelia.out$imputations)
mitools.fit <- MIcombine(with(imp.data, lm(tariff ~ polity + pop + gdp.pc + year)))
mitools.res <- summary(mitools.fit)
mitools.res <- cbind(mitools.res, df = mitools.fit$df)
mitools.res

Ini akan memberi Anda interval kepercayaan dan proporsi dari total varians yang disebabkan oleh data yang hilang:

              results       se    (lower    upper) missInfo    df
(Intercept)  3.18e+03 7.22e+02  1.73e+03  4.63e+03     57 %  45.9
pop          3.13e-08 5.59e-09  2.03e-08  4.23e-08     19 % 392.1
gdp.pc      -2.11e-03 5.53e-04 -3.20e-03 -1.02e-03     21 % 329.4
year        -1.58e+00 3.63e-01 -2.31e+00 -8.54e-01     57 %  45.9
polity       5.52e-01 3.16e-01 -7.58e-02  1.18e+00     41 %  90.8

Tentu saja Anda bisa menggabungkan hasil yang menarik menjadi satu objek:

combined.results <- merge(mitools.res, zelig.res$coefficients[, c("t-stat", "p-value")], by = "row.names", all.x = TRUE)

Memperbarui

Setelah beberapa bermain-main, saya telah menemukan cara yang lebih fleksibel untuk mendapatkan semua informasi yang diperlukan menggunakan mice-paket. Agar ini berfungsi, Anda harus memodifikasi as.mids()fungsi -paket . Gunakan versi Gerko yang diposting di pertanyaan tindak lanjut saya :

as.mids2 <- function(data2, .imp=1, .id=2){
  ini <- mice(data2[data2[, .imp] == 0, -c(.imp, .id)], m = max(as.numeric(data2[, .imp])), maxit=0)
  names  <- names(ini$imp)
  if (!is.null(.id)){
    rownames(ini$data) <- data2[data2[, .imp] == 0, .id]
  }
  for (i in 1:length(names)){
    for(m in 1:(max(as.numeric(data2[, .imp])))){
      if(!is.null(ini$imp[[i]])){
        indic <- data2[, .imp] == m & is.na(data2[data2[, .imp]==0, names[i]])
        ini$imp[[names[i]]][m] <- data2[indic, names[i]]
      }
    } 
  }
  return(ini)
}

Dengan ini, Anda dapat melanjutkan untuk menganalisis set data yang dimasukkan:

library("mice")
imp.data <- do.call("rbind", amelia.out$imputations)
imp.data <- rbind(freetrade, imp.data)
imp.data$.imp <- as.numeric(rep(c(0:15), each = nrow(freetrade)))
mice.data <- as.mids2(imp.data, .imp = ncol(imp.data), .id = NULL)

mice.fit <- with(mice.data, lm(tariff ~ polity + pop + gdp.pc + year))
mice.res <- summary(pool(mice.fit, method = "rubin1987"))

Ini akan memberi Anda semua hasil yang bisa Anda gunakan Zeligdan mitoolsdan banyak lagi:

                  est       se     t    df Pr(>|t|)     lo 95     hi 95 nmis   fmi lambda
(Intercept)  3.18e+03 7.22e+02  4.41  45.9 6.20e-05  1.73e+03  4.63e+03   NA 0.571  0.552
pop          3.13e-08 5.59e-09  5.59 392.1 4.21e-08  2.03e-08  4.23e-08    0 0.193  0.189
gdp.pc      -2.11e-03 5.53e-04 -3.81 329.4 1.64e-04 -3.20e-03 -1.02e-03    0 0.211  0.206
year        -1.58e+00 3.63e-01 -4.37  45.9 7.11e-05 -2.31e+00 -8.54e-01    0 0.570  0.552
polity       5.52e-01 3.16e-01  1.75  90.8 8.41e-02 -7.58e-02  1.18e+00    2 0.406  0.393

Catatan, menggunakan pool()Anda juga dapat menghitung nilai- dengan disesuaikan untuk sampel kecil dengan menghilangkan -parameter. Apa yang lebih baik lagi, kini Anda juga dapat menghitung dan membandingkan model bersarang:d f R 2haldfmethodR2

pool.r.squared(mice.fit)

mice.fit2 <- with(mice.data, lm(tariff ~ polity + pop + gdp.pc))
pool.compare(mice.fit, mice.fit2, method = "Wald")$pvalue
crsh
sumber
1
Jawaban yang bagus, hanya ingin menunjukkan salah ketik sedikit, saya pikir Anda berarti: mice.res <- summary(pool(mice.fit, method = "rubin1987")).
FrankD
Tangkapan yang bagus. Saya telah memperbaiki kesalahan ketik.
crsh
8

Biasanya Anda akan mengambil nilai-p dengan menerapkan aturan Rubin pada parameter statistik konvensional seperti bobot regresi. Dengan demikian, seringkali tidak perlu untuk menggabungkan nilai-p secara langsung. Juga, statistik rasio kemungkinan dapat dikumpulkan untuk membandingkan model. Prosedur pengumpulan data untuk statistik lain dapat ditemukan dalam buku saya Fleksibel Imputasi Data yang Hilang, bab 6.

Dalam kasus di mana tidak ada distribusi atau metode yang diketahui, ada prosedur yang tidak dipublikasikan oleh Licht dan Rubin untuk tes satu sisi. Saya menggunakan prosedur ini untuk menyatukan nilai-p dari wilcoxon()prosedur, tetapi bersifat umum dan mudah untuk beradaptasi dengan kegunaan lain.

Gunakan prosedur di bawah HANYA jika semuanya gagal, seperti untuk saat ini, kami hanya tahu sedikit tentang sifat statistiknya.

lichtrubin <- function(fit){
    ## pools the p-values of a one-sided test according to the Licht-Rubin method
    ## this method pools p-values in the z-score scale, and then transforms back 
    ## the result to the 0-1 scale
    ## Licht C, Rubin DB (2011) unpublished
    if (!is.mira(fit)) stop("Argument 'fit' is not an object of class 'mira'.")
    fitlist <- fit$analyses
        if (!inherits(fitlist[[1]], "htest")) stop("Object fit$analyses[[1]] is not an object of class 'htest'.")
    m <- length(fitlist)
    p <- rep(NA, length = m)
    for (i in 1:m) p[i] <- fitlist[[i]]$p.value
    z <- qnorm(p)  # transform to z-scale
    num <- mean(z)
    den <- sqrt(1 + var(z))
    pnorm( num / den) # average and transform back
}
Stef van Buuren
sumber
@ Stef van Buuren apa yang Anda maksud dengan 'mengambil nilai-p dengan menerapkan aturan Rubin pada parameter statistik konvensional seperti bobot regresi'? Bagaimana pool() fungsi dalam paket Anda (yang sangat bagus ) sampai pada nilai p yang dikumpulkan?
llewmills