Birden çok engellenmiş veri kümesinde yapılan testlerde havuzlanmış p değerleri nasıl elde edilir?


11

Amelia'yı R'de kullanarak, birden fazla gizli veri kümesi elde ettim. Bundan sonra, SPSS'de tekrarlanan bir ölçüm testi yaptım. Şimdi, test sonuçlarını havuzlamak istiyorum. Rubin kurallarını (R'deki herhangi bir çoklu imputasyon paketi aracılığıyla uygulanır) havuz araçlarını ve standart hataları havuzlamak için kullanabileceğimi biliyorum, ancak p-değerlerini nasıl havuzlayabilirim? Mümkün mü? R'de bunu yapacak bir fonksiyon var mı? Şimdiden teşekkürler.


P-değeri meta analizi hakkında bilgi almak isteyebilirsiniz. İyi bir başlangıç ​​noktası: en.wikipedia.org/wiki/Fisher%27s_method
user29889

Yanıtlar:


13

Evet , mümkün ve evet, Rbunu yapan işlevler var. Bunun yerine elle tekrarlanan analizler p-değerleri hesaplama, paketi kullanabilirsiniz Zeligaynı zamanda anılır, vignette'in ait Amelia(-package aşağıda benim güncelleme göreceksiniz bir daha bilgilendirici yöntem için ). Bunu Ameliagöstermek için -vignette'den bir örnek kullanacağım :

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)

Bu, -değerleri dahil karşılık gelen çıktıdır :p

  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).

zeligen küçük kareler dışında bir dizi modele sığabilir .

Tahminleriniz için güven aralıkları ve serbestlik derecesi elde etmek için şunları kullanabilirsiniz 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

Bu size güven aralıkları ve eksik verilere atfedilebilen toplam varyansın oranını verecektir:

              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

Tabii ki ilginç sonuçları tek bir nesnede birleştirebilirsiniz:

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

Güncelleme

Biraz oynadıktan sonra, mice-package kullanarak gerekli tüm bilgileri almanın daha esnek bir yolunu buldum . Bunun çalışması için paketin işlevini değiştirmeniz gerekir as.mids(). Kullanım Gerko sürümü benim gönderilmiş takip sorusu :

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)
}

Bu tanımlanmış olarak, engellenen veri kümelerini analiz etmeye devam edebilirsiniz:

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"))

Bu size tüm kullandığınız olsun sonuçlar verecektir Zeligve mitoolsdaha:

                  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

Kullanarak Not pool()yapabilirsiniz ayrıca hesapla ile-değerleri atlanması ile küçük örnekler için düzeltilmiş -parametre. Daha da iyisi, artık hesaplayabilir ve iç içe modelleri karşılaştırabilirsiniz:pdfmethodR2

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

1
Güzel cevap, sadece hafif bir yazım hatası işaret etmek istedim Ne demek düşünüyorum: mice.res <- summary(pool(mice.fit, method = "rubin1987")).
FrankD

İyi yakalama. Yazım hatasını düzelttim.
crsh

8

Normalde, regin ağırlıkları gibi geleneksel istatistiksel parametrelere Rubin kurallarını uygulayarak p değerini alırsınız. Bu nedenle, p değerlerinin doğrudan bir araya getirilmesine gerek yoktur. Ayrıca, olasılık oranı istatistiği modelleri karşılaştırmak için bir araya getirilebilir. Diğer istatistikler için birleştirme prosedürleri, Eksik Verilerin Esnek İçe Aktarılması, bölüm 6 kitabımda bulunabilir.

Bilinen bir dağıtımın veya yöntemin olmadığı durumlarda, Licht ve Rubin tarafından tek taraflı testler için yayınlanmamış bir prosedür vardır. Bu prosedürü prosedürden p-değerlerini bir araya wilcoxon()getirmek için kullandım, ancak diğer kullanımlara uyum sağlamak genel ve kolaydır.

SADECE diğer her şey başarısız olursa aşağıdaki prosedürü kullanın, şimdilik olduğu gibi, istatistiksel özellikleri hakkında çok az şey biliyoruz.

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 'Rubin'in kurallarını regresyon ağırlıkları gibi geleneksel istatistiksel parametrelere uygulayarak p değerini al' ile ne demek istiyorsun? Nasıl yok pool() (senin paketinde işlevi mükemmel bu arada) Toplanmış p-değeri varmak?
llewmills
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.