여러 대치 된 데이터 세트에서 수행 된 테스트에서 풀링 된 p- 값을 얻는 방법은 무엇입니까?


11

R에서 Amelia를 사용하여 여러 대치 된 데이터 집합을 얻었습니다. 그 후 SPSS에서 반복 측정 테스트를 수행했습니다. 이제 테스트 결과를 풀링하고 싶습니다. Rubin의 규칙 (R의 다중 대치 패키지를 통해 구현 됨)을 사용하여 평균 및 표준 오류를 풀 수 있지만 p- 값을 풀링하는 방법을 알고 있습니다. 가능합니까? R에 그렇게하는 기능이 있습니까? 미리 감사드립니다.


p- 값 메타 분석에 대한 정보를 확인하려고 할 수 있습니다. 좋은 출발점 : en.wikipedia.org/wiki/Fisher%27s_method
user29889

답변:


13

그렇습니다 . 가능하며, R그 기능을 수행하는 기능이 있습니다. 대신 손으로 반복 분석의 P-값을 계산, 당신은 패키지 사용할 수 있습니다 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)

포함하는 해당 출력입니다 .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).

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-package를 사용하여 필요한 모든 정보를 얻는 더 유연한 방법을 찾았습니다 . 이것이 작동하려면 패키지의 기능을 수정해야합니다 as.mids(). 내 후속 질문에 게시 된 Gerko의 버전을 사용하십시오 .

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

이렇게하면 모든 사용 얻을 결과를 줄 것이다 Zeligmitools더 :

                  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()할 수도 있습니다 계산 와 -values 생략하여 작은 샘플 조정 -parameter을. 더 좋은 점은 이제 계산 하고 중첩 된 모델을 비교할 수도 있습니다 .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
큰 대답은 단지 약간의 오타를 지적하고 싶었습니다 mice.res <- summary(pool(mice.fit, method = "rubin1987")).
FrankD

잘 잡았습니다. 오타를 수정했습니다.
crsh

8

일반적으로 회귀 가중치와 같은 기존 통계 매개 변수에 Rubin의 규칙을 적용하여 p- 값을 사용합니다. 따라서 종종 p- 값을 직접 풀링 할 필요가 없습니다. 또한 우도 비 통계량을 모아 모형을 비교할 수 있습니다. 다른 통계에 대한 풀링 절차는 필자의 저서 '유연한 데이터의 융통성있는 대치'6 장에서 찾을 수 있습니다.

알려진 분포 나 방법이없는 경우 Licht와 Rubin의 일방적 인 테스트를 위해 게시되지 않은 절차가 있습니다. 이 프로 시저를 사용하여 프로 시저에서 p- 값을 풀링 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 '회귀 가중치와 같은 일반적인 통계 매개 변수에 루빈의 규칙을 적용하여 p- 값을 취하십시오'는 무슨 뜻입니까? 어떻게 않습니다 pool() (당신의 패키지에 기능 이 뛰어난 방법으로는) 풀링 된 p- 값에 도달?
llewmills
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.