R MICE 데이터 대치의 실행 시간을 개선하는 방법


9

간단히 말해서 : R MICE (데이터 대치)의 실행 시간을 향상시키는 방법이 있습니까?

누락 된 데이터가 무작위로 포함 된 데이터 세트 (30 변수, 130 만 행)로 작업하고 있습니다. 30 개 변수 중 약 15 개에서 관측치의 약 8 %가 NA를 포함합니다. 누락 된 데이터를 무시하기 위해 MICE 패키지의 일부인 MICE 기능을 실행하고 있습니다.

method = "fastpmm"및 m = 1 인 하위 집합 (100,000 행)에서도 실행 시간이 상당히 느리고 약 15 분 동안 실행됩니다.

성능을 크게 잃지 않으면 서 실행 시간을 개선 할 수있는 방법이 있습니까? (mice.impute.mean은 매우 빠르지 만 중요한 정보 손실이 있습니다!).

재현 가능한 코드 :

library(mice)
df <- data.frame(replicate(30,sample(c(NA,1:10),1000000,rep=TRUE)))
df <- data.frame(scale(df))

output <- mice(df, m=1, method = "fastpmm")

1
일반적으로 : 이러한 종류의 질문은 교차 검증에 적합합니까, 아니면 스택 오버 플로우에 더 적합합니까?
Dendrobates

3
판결 요청 일 수 있습니다. (일반 원칙으로) 실행 시간의 가장 실질적인 개선은 기본 알고리즘을 이해함으로써 얻을 수 있기 때문에 사람들이 대체 접근법을 제안 할 수있는 커뮤니티에서 실제로 효과적인 답변을 얻을 수있는 최선의 기회가 여기에있을 것으로 기대합니다 . 하루나 이틀 안에 충분한 답변을 얻지 못한 경우이 게시물을 마이그레이션 용으로 신고하면 해당 게시물이 그 동안 SO로 전송됩니다 (그 동안 답변과 의견과 함께 수집 될 수 있음).
whuber

1
'fastppm'옵션을 'norm'으로 변경할 수 있습니다. 더 빨라질 것입니다
marc1s

1
Thx @ marc1s는 대규모 데이터 세트의 경우 크게 향상되었습니다. 10,000 개의 행이있는 임의 데이터 프레임 (위와 같이)의 경우 "norm"방법은 "fastpmm"보다 약 4 배 빠릅니다. 50,000 행으로 12 배 빨라졌습니다. 따라서, 실행 시간의 상대적 이득은 행 수만큼 증가합니다.
Dendrobates

1
실행하려는 모델에 따라 최대 우도 (또는 전체 정보 최대 우도) 추정을 사용하는 것이 더 빠를 수 있습니다. 이는 모형이 올바르게 지정된 경우 무조건 대치와 동일합니다. 다음은 여러 가지 방법을 비교 한 논문입니다. emeraldinsight.com/doi/abs/10.1108/JCP-02-2015-0007
Jeremy Miles

답변:


4

당신은 사용할 수 있습니다 quickpred()에서 mice사용자가 지정하여 예측을 제한 할 수있는 사용하여 패키지 mincor (최소 상관 관계) 및 minpuc (사용 가능한 경우 비율). 또한 예측 변수를 제어하기 위해 제외 및 포함 매개 변수를 사용할 수 있습니다.


2

mice하나의 추가 인수를 포함 하는 함수에 대한 래퍼를 만들었습니다. droplist여기서 대치 수식의 오른쪽에 사용 하지 않으려 는 예측 변수의 문자 벡터를 전달할 수 있습니다 . 여러 수준의 요인 변수가 대치 속도를 상당히 느리게 한다는 것을 알았 으므로 속도가 빨랐습니다 . quickpred@Aanish가 참조 하는 함수를 몰랐으며 두 개념을 함께 사용할 수 있습니다.

아래는 glmmplus 패키지에 나타나는 기능 입니다. 유용하다고 생각되면 실제 mice패키지 에서 풀 요청을 열 수 있습니다 .

ImputeData <- function(data, m = 10, maxit = 15, droplist = NULL) {
  if (length(intersect(names(data), droplist)) < length(droplist)) {
    stop("Droplist variables not found in data set")
  }
  predictorMatrix <- (1 - diag(1, ncol(data)))
  for (term in droplist) {
  drop.index <- which(names(data) == term)
    predictorMatrix[, drop.index] <- 0
  }
  mids.out <- mice(data, m = m, maxit = maxit,
                   predictorMatrix = predictorMatrix)
  return(mids.out)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.