결 측값에 대한 다중 대치


13

특정 제약 조건에서 데이터 세트의 누락 된 값을 대체하기 위해 대치를 사용하고 싶습니다.

예를 들어, 내가 귀속 변수를 싶습니다 x1크거나 내 다른 두 변수의 합과 같다,라고 x2하고 x3. 또한 나 x3중 하나에 의해 대치되고 싶 거나 나 중 하나에 의해 대치되고 싶습니다 .0>= 14x20>= 16

다중 대치에 대해 SPSS에서 이러한 제약 조건을 정의하려고 시도했지만 SPSS에서는 최대 값과 최소값 만 정의 할 수 있습니다. SPSS에서 추가 제약 조건을 정의 할 수있는 방법이 있습니까, 아니면 결 측값의 대치에 대한 이러한 제약 조건을 정의 할 수있는 R 패키지를 알고 있습니까?

내 데이터는 다음과 같습니다.

   x1 =c(21, 50, 31, 15, 36, 82, 14, 14, 19, 18, 16, 36, 583, NA,NA,NA, 50, 52, 26, 24)
   x2 = c(0, NA, 18,0, 19, 0, NA, 0, 0, 0, 0, 0, 0,NA,NA, NA, 22, NA, 0, 0)
   x3 = c(0, 0, 0, 0, 0, 54, 0 ,0, 0, 0, 0, 0, 0, NA, NA, NA, NA, 0, 0, 0)
   dat=data.frame(x1=x1, x2=x2, x3=x3)
   > dat
       x1 x2 x3
   1   21  0  0
   2   50 NA  0
   3   31 18  0
   4   15  0  0
   5   36 19  0
   6   82  0 54
   7   14 NA  0
   8   14  0  0
   9   19  0  0
   10  18  0  0
   11  16  0  0
   12  36  0  0
   13 583  0  0
   14  NA NA NA
   15  NA NA NA
   16  NA NA NA
   17  50 22 NA
   18  52 NA  0
   19  26  0  0
   20  24  0  0

나는 변화 0 or 16 or >= 160 or >= 16부터 >=16값을 포함한다 16. 그것이 당신의 의미를 망치지 않기를 바랍니다. 동일0 or 14 or >= 14
Alexis

답변:


16

한 가지 해결책은 mice패키지에 대한 사용자 정의 대치 기능을 작성하는 것 입니다. 패키지는이를 위해 준비되었으며 설정은 놀라 울 정도로 고통이 없습니다.

먼저 제안 된대로 데이터를 설정합니다.

dat=data.frame(x1=c(21, 50, 31, 15, 36, 82, 14, 14, 19, 18, 16, 36, 583, NA,NA,NA, 50, 52, 26, 24), 
               x2=c(0, NA, 18,0, 19, 0, NA, 0, 0, 0, 0, 0, 0,NA,NA, NA, 22, NA, 0, 0), 
               x3=c(0, 0, 0, 0, 0, 54, 0 ,0, 0, 0, 0, 0, 0, NA, NA, NA, NA, 0, 0, 0))

다음으로 mice패키지 를로드하고 기본적으로 어떤 방법을 선택하는지 확인하십시오.

library(mice)
# Do a non-imputation
imp_base <- mice(dat, m=0, maxit = 0)

# Find the methods that mice chooses
imp_base$method
# Returns: "pmm" "pmm" "pmm"

# Look at the imputation matrix
imp_base$predictorMatrix
# Returns:
#   x1 x2 x3
#x1  0  1  1
#x2  1  0  1
#x3  1  1  0

pmm의미 예측 평균 일치 연속 변수를 전가하기위한 아마도 가장 인기 전가 알고리즘 -. 회귀 모형을 사용하여 예측값을 계산하고 예측값에 가장 가까운 5 개의 요소를 선택합니다 ( 유클리드 거리 기준 ). 이러한 선택된 요소를 공여자 풀이라고하며 최종 값은이 공여자 풀에서 무작위로 선택됩니다.

예측 행렬에서 우리는 메소드가 제한에 관심있는 변수를 전달 받는다는 것을 알았습니다. 행은 목표 변수이고 열은 예측 변수입니다. x1에 x3 열에 1이 없으면 행렬에 이것을 추가해야합니다.imp_base$predictorMatrix["x1","x3"] <- 1

이제 재미있는 부분으로 대치 방법을 생성합니다. 여기에서 기준을 충족하지 않으면 모든 값을 버리는 다소 조잡한 방법을 선택했습니다. 이로 인해 루프 시간이 길어지고 유효한 대치를 유지하고 나머지 대치 만 다시 실행하는 것이 잠재적으로 더 효율적일 수 있지만 조금 더 조정해야합니다.

# Generate our custom methods
mice.impute.pmm_x1 <- 
  function (y, ry, x, donors = 5, type = 1, ridge = 1e-05, version = "", 
            ...) 
  {
    max_sum <- sum(max(x[,"x2"], na.rm=TRUE),
                   max(x[,"x3"], na.rm=TRUE))
    repeat{
      vals <- mice.impute.pmm(y, ry, x, donors = 5, type = 1, ridge = 1e-05,
                              version = "", ...)
      if (all(vals < max_sum)){
        break
      }
    }
    return(vals)
  }

mice.impute.pmm_x2 <- 
  function (y, ry, x, donors = 5, type = 1, ridge = 1e-05, version = "", 
            ...) 
  {
    repeat{
      vals <- mice.impute.pmm(y, ry, x, donors = 5, type = 1, ridge = 1e-05,
                              version = "", ...)
      if (all(vals == 0 | vals >= 14)){
        break
      }
    }
    return(vals)
  }

mice.impute.pmm_x3 <- 
  function (y, ry, x, donors = 5, type = 1, ridge = 1e-05, version = "", 
            ...) 
  {
    repeat{
      vals <- mice.impute.pmm(y, ry, x, donors = 5, type = 1, ridge = 1e-05,
                              version = "", ...)
      if (all(vals == 0 | vals >= 16)){
        break
      }
    }
    return(vals)
  }

메소드 정의가 완료되면 이전 메소드를 간단히 변경합니다. 단일 변수 만 변경하려면 간단히 사용할 수 imp_base$method["x2"] <- "pmm_x2"있지만이 예제에서는 모두 변경합니다 (이름은 필요하지 않음).

imp_base$method <- c(x1 = "pmm_x1", x2 = "pmm_x2", x3 = "pmm_x3")

# The predictor matrix is not really necessary for this example
# but I use it just to illustrate in case you would like to 
# modify it
imp_ds <- 
  mice(dat, 
       method = imp_base$method, 
       predictorMatrix = imp_base$predictorMatrix)

이제 세 번째 대치 된 데이터 세트를 살펴 보겠습니다.

> complete(imp_ds, action = 3)
    x1 x2 x3
1   21  0  0
2   50 19  0
3   31 18  0
4   15  0  0
5   36 19  0
6   82  0 54
7   14  0  0
8   14  0  0
9   19  0  0
10  18  0  0
11  16  0  0
12  36  0  0
13 583  0  0
14  50 22  0
15  52 19  0
16  14  0  0
17  50 22  0
18  52  0  0
19  26  0  0
20  24  0  0

좋아, 그 일을 해. 주류 함수를 피기 백하고 의미있는 제한을 추가 할 수 있기 때문에이 솔루션을 좋아합니다.

최신 정보

주석에 언급 된 엄격한 제한 @ t0x1n을 적용하기 위해 래퍼 함수에 다음 기능을 추가 할 수 있습니다.

  1. 이전에 부분적으로 성공적인 실행의 데이터가 삭제되지 않도록 루프 중에 유효한 값을 저장하십시오.
  2. 무한 루프를 피하기위한 이스케이프 메커니즘
  3. 적합한 성냥을 찾지 않고 x 번 시도한 후에 기증자 풀을 팽창시킵니다 (이는 주로 pmm에 적용됨)

이로 인해 약간 더 복잡한 래퍼 함수가 생성됩니다.

mice.impute.pmm_x1_adv <-   function (y, ry, 
                                      x, donors = 5, 
                                      type = 1, ridge = 1e-05, 
                                      version = "", ...) {
  # The mice:::remove.lindep may remove the parts required for
  # the test - in those cases we should escape the test
  if (!all(c("x2", "x3") %in% colnames(x))){
    warning("Could not enforce pmm_x1 due to missing column(s):",
            c("x2", "x3")[!c("x2", "x3") %in% colnames(x)])
    return(mice.impute.pmm(y, ry, x, donors = 5, type = 1, ridge = 1e-05,
                           version = "", ...))
  }

  # Select those missing
  max_vals <- rowSums(x[!ry, c("x2", "x3")])

  # We will keep saving the valid values in the valid_vals
  valid_vals <- rep(NA, length.out = sum(!ry))
  # We need a counter in order to avoid an eternal loop
  # and for inflating the donor pool if no match is found
  cntr <- 0
  repeat{
    # We should be prepared to increase the donor pool, otherwise
    # the criteria may become imposs
    donor_inflation <- floor(cntr/10)
    vals <- mice.impute.pmm(y, ry, x, 
                            donors = min(5 + donor_inflation, sum(ry)), 
                            type = 1, ridge = 1e-05,
                            version = "", ...)

    # Our criteria check
    correct <- vals < max_vals
    if (all(!is.na(valid_vals) |
              correct)){
      valid_vals[correct] <-
        vals[correct]
      break
    }else if (any(is.na(valid_vals) &
                    correct)){
      # Save the new valid values
      valid_vals[correct] <-
        vals[correct]
    }

    # An emergency exit to avoid endless loop
    cntr <- cntr + 1
    if (cntr > 200){
      warning("Could not completely enforce constraints for ",
              sum(is.na(valid_vals)),
              " out of ",
              length(valid_vals),
              " missing elements")
      if (all(is.na(valid_vals))){
        valid_vals <- vals
      }else{
        valid_vals[is.na(valid_vals)] <- 
          vals[is.na(valid_vals)]
      }
      break
    }
  }
  return(valid_vals)
}

제안 된 데이터 세트가 모든 경우에 대한 제한 조건을 누락하지 않고 실패했을 가능성이 높습니다 . 동작을 시작하기 전에 루프 길이를 400-500으로 늘려야합니다. 나는 이것이 의도하지 않은 것으로 가정하고, 대치가 실제 데이터 생성 방법을 모방해야합니다.

최적화

인수 ry에는 비결 측 값이 포함되어 있으며 적절한 대치로 찾은 요소를 제거하여 루프 속도를 높일 수는 있지만 내부 함수에 익숙하지 않기 때문에 이것을 삼가했습니다.

완전히 채우는 데 시간이 걸리는 강력한 제약 조건이있을 때 가장 중요한 것은 대치 를 병렬화하는 것입니다 ( CrossValidated에 대한 내 답변 참조 ). 오늘날 대부분의 컴퓨터에는 4-8 개의 코어가 있으며 R은 기본적으로 그 중 하나만 사용합니다. 코어 수를 두 배로 늘림으로써 시간을 절반으로 줄일 수 있습니다.

대치시 누락 된 매개 변수

x2대치 시점에서 누락되는 문제와 관련하여 마우스는 실제로 누락 된 값을 x-에 공급하지 않습니다 data.frame. 방법은 시작시 어떤 임의의 값으로 채우는 포함한다. 대치의 체인 부분은이 초기 값의 영향을 제한합니다. mice-function 을 보면 대치 호출 ( mice:::sampler-function) 이전에이를 찾을 수 있습니다 .

...
if (method[j] != "") {
  for (i in 1:m) {
    if (nmis[j] < nrow(data)) {
      if (is.null(data.init)) {
        imp[[j]][, i] <- mice.impute.sample(y, 
                                            ry, ...)
      }
      else {
        imp[[j]][, i] <- data.init[!ry, j]
      }
    }
    else imp[[j]][, i] <- rnorm(nrow(data))
  }
}
...

data.init에 공급 될 수있는 mice기능 및 mice.imput.sample는 기본 샘플링 절차이다.

방문 순서

방문 순서가 중요한 경우 mice-function이 대치를 실행하는 순서를 지정할 수 있습니다 . 기본값은 1:ncol(data)이지만 원하는 visitSequence것을으로 설정할 수 있습니다 .


+1 이것은 내가 생각했던 것 (Frank의 답변에 대한 나의 의견 참조)이며, 현재 바운티 1 위 후보입니다. 몇 가지에 대한 문제 나 pmm_x1생각 : (1)의 모든 가능한 조합의 최대 합 촬영 x2x3전체 데이터 세트에서 원래 제약 조건보다 훨씬 스트링거입니다. 정확한 것은 그것을 테스트하는 것입니다 각 행에 대해 , x1 < x2 + x3. 물론 행이 많을수록 단일 제약 조건을 준수 할 가능성이 적어지고 (하나의 잘못된 행이 모든 것을 망칠 수 있음) 루프가 더 오래 걸릴 수 있습니다.
t0x1n

(2) 두 경우 x1x2누락, 당신은 값 전가 할 수있다 x1번 (하자 50 말)하는 제약 개최됩니다 만, x2(하자가 55로 전가 말할)가 깨진 전가됩니다. 세로가 아닌 "가로로"대치하는 방법이 있습니까? 우리의 단일 행을 전가 수있는 방법 x1, x2그리고 x3단순히 재 전가하며 특정 행은 제약 아래로 떨어질 때까지. 그것은 충분히 빠르며, 일단 완료되면 다음 행으로 이동할 수 있습니다. 물론 MI가 본질적으로 "수직"이라면 운이 좋지 않습니다. 이 경우 Aleksandr이 언급 한 접근 방식일까요?
t0x1n

멋진 솔루션, +1! 현재 mice패키지를 사용하고 있으므로 특히 유용 할 수 있습니다 . 공유해 주셔서 감사합니다.
Aleksandr Blekh

1
@ t0x1n 귀하의 의견에 따라 고급 래퍼 기능으로 답변을 업데이트했습니다. 더 깊게 다이빙하고 싶다면 형제와 함께 debug()어떻게 mice.impute.pmm작동 하는지 확인하기 위해 와 함께 놀아 보는 것이 좋습니다 .
Max Gordon

1
@ t0x1n : 추측합니다-대치 된 값을 검사하십시오. 그들이 비현실적으로 보인다면, 모델에 덜 중심적인 것들만을 대치하기 위해 나의 접근법을 선택할 수 있습니다. 제 경우에는 추적 X- 레이가없는 환자는 연구의 중심에 있고 대치가 임상 적으로 그럴듯한 가치를 제공하지 않기 때문에 골절을 선택했습니다 (골절 후 다리가 더 길어짐). 나는 이것에 완전히 만족하지는 않지만 합리적인 타협처럼 보입니다.
Max Gordon

8

내가 찾을 수있는 가장 가까운 것은 Amelia의 사전 정보 포함입니다. 비 네트의 4.7 장 , 특히 4.7.2를 참조하십시오 .

관찰 수준 이전

연구자들은 종종 이전 연구, 학문적 합의 또는 개인적 경험을 바탕으로 결측 데이터 값에 대한 추가 사전 정보를 가지고 있습니다. Amelia는이 정보를 통합하여 대폭 개선 된 대치 작업을 수행 할 수 있습니다. Amelia 알고리즘을 사용하면보다 일반적인 모델 매개 변수 대신 개별 누락 데이터 셀에 대한 정보를 제공하는 베이지안 사전 정보를 포함 할 수 있습니다.

이전의 통합은 대치가 모델 기반 대치의 가중 평균 인 것으로 판명 된 기본 베이지안 분석과 가중치가 데이터의 상대 강도의 함수이고 이전의 경우 : 모형이 매우 잘 예측되는 경우를 따릅니다. , 대치가 이전의 무게를 줄이며 그 반대도 마찬가지이다 (Honaker and King, 2010).

개별 관측에 대한 선행 사항은 누락 된 데이터 셀의 분포에 대한 분석가의 신념을 설명해야합니다. 이것은 평균과 표준 편차 또는 신뢰 구간의 형태를 취할 수 있습니다. 예를 들어, 태국의 1986 년 타리 율이 약 40 %라는 것을 알 수 있지만 정확한 값에 대해서는 약간의 불확실성이 있습니다. 결측 데이터 셀의 분포에 대한 우리의 이전의 믿음은 우리의 이전의 믿음에 대한 불확실성의 정도를 반영하는 표준 편차를 가진 40을 중심으로합니다.

우선 순위를 입력하려면 4 개 또는 5 개의 열로 우선 순위 행렬을 작성해야합니다. 행렬의 각 행은 하나의 관측치 또는 하나의 변수에 대한 선행을 나타냅니다. 모든 행에서 첫 번째 열의 항목은 관측치의 행이고 두 번째 열은 관측치의 열입니다. 4 개의 열 우선 순위 행렬에서, 3 번째 및 4 번째 열은 결 측값의 사전 분포의 평균 및 표준 편차이다.

따라서 일반적으로와 같은 것을 말할 수는 없지만 x1<x2+x3데이터 세트를 반복하고 각 관련 사례에 대해 관측 수준을 추가 할 수 있습니다. 상수 경계를 적용 할 수도 있습니다 (예 : x1, x2 및 x3을 음이 아닌 값으로 설정). 예를 들면 다음과 같습니다.

priors = matrix(NA, nrow=0, ncol=5);
for (i in seq(1, length(data))) 
{
    x1 = data$x1[i];
    x2 = data$x2[i];
    x3 = data$x3[i];

    if (is.na(x1) && !is.na(x2) && !is.na(x3))
    {
        priors = rbind(priors, c(i, 1, 0, x2+x3, 0.999999))
    }
}

amelia(data, m=1, bound = rbind(c(1, 0, Inf), c(2, 0, Inf), c(3, 0, Inf)), pr = priors);

5

다중 대치와 일치하는 예측 평균에서 제약 조건을 구현하기가 더 쉬울 것입니다. 이는 구속 조건을 충족시키는 비결 측 구속 조건 변수에 대해 상당한 수의 관측치가 있다고 가정합니다. R Hmisc패키지 aregImpute함수 에서 이것을 구현할 생각 입니다. 한 달 정도 후에 다시 확인하고 싶을 수도 있습니다. 구속 조건이 공여자를 이상적인 구속되지 않은 공여자로부터 멀어지게하기 때문에 공여자 관찰이 가능한 대상으로부터 최대 거리를 지정하는 것이 중요합니다.


나는 이것도 갖고 싶어. 가장 기본적인 변수 간 제약 조건 만 필요합니다 x<y<z.
t0x1n

내가 떠났을 때는 무지를 용서하지만 여러 대치 기술이 적절한 분포에서 가치를 끌어내는 것과 관련이 있다는 인상을 받았습니다. 거부 샘플링을 사용하는 것이 간단하지 않습니까? 예를 들어 지정된 구속 조건 (예 x1<x2:)이 충족 될 때까지 계속 그리 시겠습니까?
t0x1n

그것이 aregImpute예측 평균 매칭을 가진 R 함수로 할 수있는 일입니다 . 그러나 공여체 관측치 (예측치 근처)가 공여 변수 세트에 대한 구속 조건을 분명히 충족시켜야하더라도 대상 관측치에 대한 구속 조건을 충족시키지 못하면 어떨까요?
Frank Harrell

이 경우, 예측값을 직접 가져 오겠습니까? 그것은 그러한 샘플에 대한 회귀에만 의존합니까 (PMM 단계 제외)?
t0x1n November

회귀 대치 (regression imputation)는 나머지 피험자의 기록과 일치하지 않는 대치 된 값으로 나타날 가능성이 약간 더 높습니다. 그래서 이것이 PMM을 피해야 할 이유라고 생각하지 않습니다.
Frank Harrell

4

Amelia(Amelia II) 패키지는 현재 데이터 값 범위 제약 조건을 지정하는 데 가장 포괄적 인 지원을하고 있다고 생각합니다 . 그러나 문제는 Amelia데이터가 다변량 정상 이라고 가정한다는 것입니다.

다변량 정규성 가정이 적용되지 않는 경우 연쇄 방정식을 통해 다중 대치 (MI)를 mice구현 하는 패키지 를 확인 하는 것이 좋습니다. 이 패키지는 다변량 정규성을 가정하지 않습니다 . 또한 constraints 를 지정하기에 충분한 함수가 있지만 어느 정도 확실하지 않습니다. 이 기능을 호출 합니다. http://cran.r-project.org/web/packages/mice/mice.pdf 문서에서 이에 대해 읽을 수 있습니다 . 또 다른 이점은 사용자 정의 대치 기능을 지정하고 더 넓은 알고리즘을 선택할 수있는 유연성입니다. 다음은 MI를 사용하는 방법에 대한 자습서입니다 .squeeze()micemicehttp://www.ats.ucla.edu/stat/r/faq/R_pmm_mi.htm .

내가 이해하는 한, Harrell의 Hmisc패키지는 동일한 연쇄 방정식 ( 예측 평균 일치 ) 접근 방식을 사용하여 비정규 데이터를 지원할 수 있습니다 ( normpmm방법을 제외하고 ). 어쩌면 그는 위의 답변에 따라 제약 조건 사양 기능을 이미 구현했을 수도 있습니다. 내가 사용하지 않은 aregImpute()그래서 (내가 사용한 적이 훨씬 더 그것에 대해 말할 수 없다, Amelia그리고 mice단지 내가 할 수있는만큼 많은 것을 배우려고 노력하고,하지만 확실히 통계 전문가가 아니에요).

마지막으로, 결 측값이있는 여러 데이터 대치에 대한 접근 방식, 방법 및 소프트웨어에 대한 약간의 날짜는 있지만 여전히 멋진 개요 가 흥미로울 수 있습니다 . http://www.ncbi.nlm.nih.gov/pmc/articles / PMC1839993 . MI에 대한 최신 개요 문서가 있다고 확신하지만 현재로서는 이것이 전부입니다. 이것이 다소 도움이되기를 바랍니다.


1
이 좋은 의견은 누락 된 데이터를 실제로 관측 된 값으로 대체하는 예측 평균 일치가 관측 된 모든 데이터가 해당 제약 조건을 충족하는 경우 이미 몇 가지 제약 조건을 포함 할 수 있다고 생각합니다. 나는 이것을 통해 생각하는 누군가에게 감사 할 것입니다. 에 특별한 제한을 아직 구현하지 않았습니다 aregImpute.
Frank Harrell

1
네 말이 맞아 기증자 관찰 다른 변수 와 일치 하지만 목표 변수의 다른 변수와 일치 하지 않는 값을 제공한다는 것을 깨달았습니다 .
Frank Harrell

1
Amelia의 배포 가정을 제외하고는 내가 대답에서 설명한 것보다 더 자세한 제약 조건을 지정할 수 있었습니까? 문제 squeeze는 그 경계가 일정하므로와 같은 것을 지정할 수 없다는 것 x1<x2입니다. 또한 대치 된 결과 벡터에서 호출 된 것으로 보이며 너무 늦습니다. 대치 과정에서 경계를 고려해야하므로 사후 조정보다 더 의미가 있습니다.
t0x1n

1
@ t0x1n : 불행하게도, 나는에 제약을 지정할 수있는 기회가 없었어요 Amelia내가에게로 전환했기 때문에, mice내 테스트 내 데이터가 정상 다변량하지가 있음을 확인하자마자을. 그러나, 나는 최근에 주제에 대한 프리젠 테이션 슬라이드 (MI 방법 및 소프트웨어)이 아주 좋은 세트를 가로 질러 : statistik.lmu.de/~fkreuter/imputation_sose2011/downloads/...를 . 올바르게 이해하면 제약 조건 문제에 대한 잠재적 해결책을 설명합니다 (슬라이드 번호 50이 아니라 PDF 페이지 50 참조). 도움이 되었기를 바랍니다.
Aleksandr Blekh

1
@ t0x1n : 실제로, 용액 페이지 50 및 51에 설명
알렉산드르 Blekh

0

귀하의 질문을 올바르게 이해하면 누락 된 변수가 어떤 제약을 받아야하는지 어떤 값을 이미 알고있는 것 같습니다. 나는 SPSS에 대해 잘 모르지만 RI에서는 그렇게 할 수있는 기능을 작성할 수 있다고 생각한다. 그러한 제약 조건으로 작동하는 패키지를 모르겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.