Làm thế nào để có được giá trị p gộp trong các thử nghiệm được thực hiện trong nhiều bộ dữ liệu được liệt kê?


11

Sử dụng Amelia trong R, tôi đã thu được nhiều bộ dữ liệu. Sau đó, tôi đã thực hiện một bài kiểm tra các biện pháp lặp đi lặp lại trong SPSS. Bây giờ, tôi muốn gộp kết quả kiểm tra. Tôi biết rằng tôi có thể sử dụng các quy tắc của Rubin (được triển khai thông qua bất kỳ gói đa cấp nào trong R) để gộp các phương tiện và lỗi tiêu chuẩn, nhưng làm cách nào để gộp các giá trị p? Có thể không? Có một chức năng trong R để làm như vậy? Cảm ơn trước.


Bạn có thể muốn kiểm tra thông tin về phân tích tổng hợp giá trị p. Một điểm khởi đầu tốt: vi.wikipedia.org/wiki/Fisher%27s_method
user29889

Câu trả lời:


13

Vâng , có thể và, vâng, có những Rchức năng làm điều đó. Thay vì tính toán các giá trị p của các phân tích lặp đi lặp lại bằng tay, bạn có thể sử dụng gói Zelig, cũng được đề cập trong phần họa tiết của Ameliagói ( để biết thêm thông tin, hãy xem cập nhật của tôi dưới đây ). Tôi sẽ sử dụng một ví dụ từ Amelia-vignette để chứng minh điều này:

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)

Đây là đầu ra tương ứng bao gồm giá trị :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).

zeligcó thể phù hợp với một loạt các mô hình khác với hình vuông nhỏ nhất.

Để có được khoảng tin cậy và mức độ tự do cho các ước tính của bạn, bạn có thể sử dụng 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

Điều này sẽ cung cấp cho bạn khoảng tin cậy và tỷ lệ của tổng phương sai có thể quy cho dữ liệu bị thiếu:

              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

Tất nhiên bạn chỉ có thể kết hợp các kết quả thú vị vào một đối tượng:

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

Cập nhật

Sau khi chơi xung quanh, tôi đã tìm thấy một cách linh hoạt hơn để có được tất cả thông tin cần thiết bằng cách sử dụng micegói. Để làm việc này, bạn sẽ cần sửa đổi as.mids()chức năng của gói . Sử dụng phiên bản của Gerko được đăng trong câu hỏi tiếp theo của tôi :

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

Với định nghĩa này, bạn có thể tiếp tục phân tích các tập dữ liệu được liệt kê:

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

Điều này sẽ cung cấp cho bạn tất cả các kết quả bạn nhận được sử dụng Zeligmitoolsvà nhiều hơn nữa:

                  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

Lưu ý, bằng cách sử dụng, pool()bạn cũng có thể tính giá trị với được điều chỉnh cho các mẫu nhỏ bằng cách bỏ qua tham số . Điều gì thậm chí còn tốt hơn, bây giờ bạn cũng có thể tính và so sánh các mô hình lồng nhau:d f R 2pdfmethodR2

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
Câu trả lời tuyệt vời, chỉ muốn chỉ ra một lỗi đánh máy nhẹ, tôi nghĩ bạn có nghĩa là : mice.res <- summary(pool(mice.fit, method = "rubin1987")).
FrankD

Nắm bắt tốt. Tôi đã sửa lỗi đánh máy.
crsh

8

Thông thường, bạn sẽ lấy giá trị p bằng cách áp dụng các quy tắc của Rubin trên các tham số thống kê thông thường như trọng số hồi quy. Vì vậy, thường không cần phải gộp các giá trị p trực tiếp. Ngoài ra, thống kê tỷ lệ khả năng có thể được gộp lại để so sánh các mô hình. Các quy trình tổng hợp cho các số liệu thống kê khác có thể được tìm thấy trong cuốn sách của tôi Tính toán linh hoạt của dữ liệu bị thiếu, chương 6.

Trong trường hợp không có phân phối hoặc phương pháp đã biết, có một quy trình chưa được công bố bởi Licht và Rubin cho các xét nghiệm một phía. Tôi đã sử dụng thủ tục này để gộp các giá trị p từ wilcoxon()thủ tục, nhưng nó chung chung và đơn giản để thích ứng với các sử dụng khác.

Sử dụng quy trình dưới đây CHỈ nếu tất cả các cách khác đều thất bại, vì hiện tại, chúng tôi biết rất ít về các thuộc tính thống kê của nó.

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, ý của bạn là gì khi 'lấy giá trị p bằng cách áp dụng các quy tắc của Rubin trên các tham số thống kê thông thường như trọng số hồi quy'? Làm thế nào để pool() chức năng trong gói của bạn (rất tuyệt vời ) đến giá trị p gộp lại?
llewmills
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.