एकाधिक प्रतिसाद किए गए डेटासेट में किए गए परीक्षणों पर पूल किए गए पी-मान कैसे प्राप्त करें?


11

आर में अमेलिया का उपयोग करते हुए, मैंने कई प्रतिरूपित डेटासेट प्राप्त किए। उसके बाद, मैंने एसपीएसएस में दोहराया उपायों का परीक्षण किया। अब, मैं परिणामों का परीक्षण करना चाहता हूं। मुझे पता है कि मैं रुबिन के नियमों का उपयोग कर सकता हूं (आर में किसी भी कई प्रतिरूपण पैकेज के माध्यम से कार्यान्वित किया गया है) पूल के साधनों और मानक त्रुटियों के लिए, लेकिन मैं पी-मूल्यों को कैसे पूल कर सकता हूं? क्या यह संभव है? क्या ऐसा करने के लिए R में कोई फ़ंक्शन है? अग्रिम में धन्यवाद।


आप पी-मूल्य मेटा-विश्लेषण के बारे में जानकारी देखना चाहते हैं। एक अच्छा प्रारंभिक बिंदु: en.wikipedia.org/wiki/Fisher%27s_method
user29889

जवाबों:


13

हां , यह संभव है और हां, ऐसे Rकार्य हैं जो इसे करते हैं। हाथ से कंप्यूटिंग दोहराया विश्लेषण के पी-मूल्यों के बजाय, आप पैकेज का उपयोग कर सकते Zeligहैं, जो में संदर्भित किया जाता है शब्दचित्र की Amelia(-package एक अधिक सूचनात्मक विधि के लिए नीचे मेरी अपडेट हुआ )। मैं इसे Ameliaप्रदर्शित करने के लिए -vignette से एक उदाहरण का उपयोग करूंगा:

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)

यह सहित समान आउटपुट है :पी

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

zeligकम से कम वर्गों के अलावा अन्य मॉडलों की मेजबानी कर सकते हैं ।

अपने अनुमानों के लिए विश्वास अंतराल और स्वतंत्रता की डिग्री प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं 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

यह आपको कुल अंतराल का अनुपात और आत्मविश्वास प्रदान करेगा जो लापता डेटा के कारण है:

              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

बेशक आप सिर्फ एक वस्तु में दिलचस्प परिणाम जोड़ सकते हैं:

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

अपडेट करें

कुछ के आसपास खेलने के बाद, मैंने mice-पैकेज का उपयोग करके सभी आवश्यक जानकारी प्राप्त करने के लिए अधिक लचीला तरीका ढूंढ लिया है। इसके लिए काम करने के लिए, आपको पैकेज के बदलाव को संशोधित करना होगा as.mids()। मेरे अनुवर्ती प्रश्न में पोस्ट किए गए गेरको के संस्करण का उपयोग करें :

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

इस परिभाषित के साथ, आप प्रतिबाधित डेटा सेट का विश्लेषण करने के लिए आगे बढ़ सकते हैं:

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

यह आपको सभी परिणाम आप उपयोग कर पाने दे देंगे Zeligऔर mitoolsऔर अधिक:

                  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

pool()पीmethodआर2

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
महान जवाब, बस थोड़ा टाइपो इंगित करना चाहता था, मुझे लगता है कि आपका मतलब है mice.res <- summary(pool(mice.fit, method = "rubin1987")):।
फ्रैंकड

अच्छी पकड़। मैंने टाइपो को ठीक किया है।
crsh

8

आम तौर पर आप प्रतिगमन भार जैसे पारंपरिक सांख्यिकीय मापदंडों पर रुबिन के नियमों को लागू करके पी-मान लेंगे। इस प्रकार, अक्सर सीधे पी-मूल्यों को पूल करने की कोई आवश्यकता नहीं है। साथ ही, मॉडल की तुलना करने के लिए संभावना अनुपात सांख्यिकीय को पूल किया जा सकता है। अन्य आँकड़ों के लिए पूलिंग प्रक्रियाएँ मेरी पुस्तक फ्लेक्सिबल इम्प्लीकेशन ऑफ़ मिसिंग डेटा, अध्याय 6 में पाई जा सकती हैं।

ऐसे मामलों में जहां कोई ज्ञात वितरण या विधि नहीं है, एकतरफा परीक्षणों के लिए लिक्ट और रुबिन द्वारा अप्रकाशित प्रक्रिया है। मैंने इस प्रक्रिया का उपयोग प्रक्रिया से पी-मानों को पूल करने के लिए किया था wilcoxon(), लेकिन अन्य उपयोगों के लिए यह सामान्य और सीधा है।

केवल नीचे की प्रक्रिया का उपयोग करें यदि बाकी सब विफल हो जाता है, जैसा कि अभी तक, हम इसके सांख्यिकीय गुणों के बारे में बहुत कम जानते हैं।

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 रुबिन वज़न जैसे पारंपरिक सांख्यिकीय मापदंडों पर रुबिन के नियमों को लागू करके 'पी-वैल्यू' लेने का क्या मतलब है? कैसे करता है pool() अपने पैकेज (जो में समारोह उत्कृष्ट माध्यम से) जमा पी-मूल्य पर पहुंचने?
llewmills
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.