Nhiều lần cắt bỏ cho các giá trị bị thiếu


13

Tôi muốn sử dụng thuật ngữ để thay thế các giá trị bị thiếu trong tập dữ liệu của mình theo các ràng buộc nhất định.

Ví dụ: tôi muốn biến số x1được liệt kê lớn hơn hoặc bằng tổng của hai biến khác của tôi, nói x2x3. Tôi cũng muốn x3bị từ chối bởi một trong hai 0hoặc >= 14và tôi muốn x2bị buộc tội bởi một trong hai 0hoặc >= 16.

Tôi đã cố gắng xác định các ràng buộc này trong SPSS cho nhiều lần cắt bỏ, nhưng trong SPSS tôi chỉ có thể xác định các giá trị tối đa và tối thiểu. Có cách nào để xác định các ràng buộc hơn nữa trong SPSS hoặc bạn có biết bất kỳ gói R nào sẽ cho phép tôi xác định các ràng buộc đó để loại bỏ các giá trị bị thiếu không?

Dữ liệu của tôi như sau:

   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

Tôi đã thay đổi 0 or 16 or >= 16đến 0 or >= 16từ >=16bao gồm giá trị 16. Hy vọng rằng đã không làm hỏng ý nghĩa của bạn lên. Tương tự cho0 or 14 or >= 14
Alexis

Câu trả lời:


16

Một giải pháp là viết các hàm cắt cụt tùy chỉnh của riêng bạn cho micegói. Gói được chuẩn bị cho việc này và thiết lập không gây đau đớn một cách đáng ngạc nhiên.

Đầu tiên chúng tôi thiết lập dữ liệu theo đề xuất:

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

Tiếp theo, chúng tôi tải micegói và xem nó chọn phương thức nào theo mặc định:

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

pmmviết tắt của kết hợp trung bình dự đoán - có lẽ là thuật toán cắt bỏ phổ biến nhất để đưa ra các biến liên tục. Nó tính toán giá trị dự đoán bằng mô hình hồi quy và chọn 5 phần tử gần nhất với giá trị dự đoán (theo khoảng cách Euclide ). Các yếu tố được chọn này được gọi là nhóm nhà tài trợ và giá trị cuối cùng được chọn ngẫu nhiên từ nhóm nhà tài trợ này.

Từ ma trận dự đoán, chúng tôi thấy rằng các phương thức nhận được các biến được quan tâm cho các hạn chế. Lưu ý rằng hàng là biến mục tiêu và cột dự đoán. Nếu x1 không có 1 trong cột x3, chúng ta sẽ phải thêm phần này vào ma trận:imp_base$predictorMatrix["x1","x3"] <- 1

Bây giờ đến phần thú vị, tạo ra các phương pháp cắt bỏ. Tôi đã chọn một phương pháp khá thô sơ ở đây nơi tôi loại bỏ tất cả các giá trị nếu chúng không đáp ứng các tiêu chí. Điều này có thể dẫn đến thời gian vòng lặp dài và nó có khả năng hiệu quả hơn để giữ các lần cắt bỏ hợp lệ và chỉ làm lại những cái còn lại, mặc dù vậy sẽ cần điều chỉnh nhiều hơn một chút.

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

Khi chúng ta hoàn thành việc xác định các phương thức, chúng ta đơn giản thay đổi các phương thức trước đó. Nếu bạn chỉ muốn thay đổi một biến duy nhất thì bạn có thể chỉ cần sử dụng imp_base$method["x2"] <- "pmm_x2"nhưng với ví dụ này, chúng tôi sẽ thay đổi tất cả (việc đặt tên là không cần thiết):

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)

Bây giờ chúng ta hãy xem bộ dữ liệu được liệt kê thứ ba:

> 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

Ok, đó là công việc. Tôi thích giải pháp này vì bạn có thể cõng trên đầu các chức năng chính và chỉ cần thêm các hạn chế mà bạn thấy có ý nghĩa.

Cập nhật

Để thực thi các hạn chế nghiêm ngặt @ t0x1n được đề cập trong các nhận xét, chúng tôi có thể muốn thêm các khả năng sau vào chức năng trình bao bọc:

  1. Lưu các giá trị hợp lệ trong các vòng lặp để dữ liệu từ các lần chạy thành công trước đó không bị loại bỏ
  2. Một cơ chế thoát để tránh các vòng lặp vô hạn
  3. Thổi phồng nhóm nhà tài trợ sau khi thử x lần mà không tìm thấy kết quả phù hợp (điều này chủ yếu áp dụng cho pmm)

Điều này dẫn đến một chức năng bao bọc phức tạp hơn một chút:

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

Lưu ý rằng điều này không thực hiện tốt điều đó, rất có thể là do tập dữ liệu được đề xuất không có các ràng buộc cho tất cả trường hợp mà không bị thiếu. Tôi cần tăng chiều dài vòng lặp lên 400-500 trước khi nó bắt đầu hoạt động. Tôi cho rằng điều này là vô ý, việc buộc tội của bạn sẽ bắt chước cách dữ liệu thực tế được tạo ra.

Tối ưu hóa

Đối số rychứa các giá trị không bị thiếu và chúng tôi có thể tăng tốc vòng lặp bằng cách loại bỏ các yếu tố mà chúng tôi đã tìm thấy các tranh chấp đủ điều kiện, nhưng vì tôi không quen với các hàm bên trong nên tôi đã kiềm chế điều này.

Tôi nghĩ rằng điều quan trọng nhất khi bạn có những ràng buộc mạnh mẽ cần có thời gian để điền đầy đủ là song song hóa các thuật ngữ của bạn ( xem câu trả lời của tôi trên CrossValidated ). Hầu hết các máy tính ngày nay có 4-8 lõi và R chỉ sử dụng một trong số chúng theo mặc định. Thời gian có thể (gần như) được cắt làm đôi bằng cách nhân đôi số lõi.

Thiếu thông số lúc cắt

Liên quan đến vấn đề x2mất tích tại thời điểm buộc tội - chuột thực sự không bao giờ đưa các giá trị bị thiếu vào x- data.frame. Các con chuột phương pháp bao gồm điền vào một số giá trị ngẫu nhiên khi khởi động. Phần chuỗi của quá trình cắt bỏ giới hạn tác động từ giá trị ban đầu này. Nếu bạn nhìn vào micechức năng, bạn có thể tìm thấy chức năng này trước cuộc gọi cắt ngang ( mice:::samplerchức năng):

...
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.initthể được cung cấp cho micehàm và mouse.imput.sample là một quy trình lấy mẫu cơ bản.

Trình tự tham quan

Nếu trình tự truy cập là quan trọng, bạn có thể chỉ định thứ tự trong đó hàm-hàm micechạy các phần tử. Mặc định là từ 1:ncol(data)nhưng bạn có thể đặt thành visitSequencebất cứ điều gì bạn thích.


+1 Đây là công cụ tuyệt vời, chính xác là những gì tôi đã nghĩ (xem nhận xét của tôi về câu trả lời của Frank) và chắc chắn là ứng cử viên số 1 cho tiền thưởng cho đến bây giờ. pmm_x1Mặc dù vậy, có một vài điều gây rắc rối cho tôi : (1) Lấy tổng số tối đa của bất kỳ sự kết hợp nào có thể có x2x3từ toàn bộ tập dữ liệu là nhiều hơn so với ràng buộc ban đầu. Điều đúng sẽ là kiểm tra điều đó cho mỗi hàng , x1 < x2 + x3. Tất nhiên bạn càng có nhiều hàng, cơ hội tuân thủ ràng buộc như vậy càng nhỏ (vì một hàng xấu duy nhất làm hỏng mọi thứ) và vòng lặp có thể có khả năng càng dài.
t0x1n

(2) nếu cả hai x1x2bị thiếu, bạn có thể áp đặt một giá trị cho x1các ràng buộc được giữ (giả sử 50), nhưng một khi x2bị tranh chấp thì chúng bị phá vỡ (giả sử nó bị buộc là 55). Có cách nào để áp đặt "theo chiều ngang" chứ không phải theo chiều dọc? Bằng cách đó chúng ta có thể quy cho một hàng duy nhất của x1, x2x3và chỉ cần tái quy cho nó cho đến khi mà cụ thể hàng thuộc hạn chế. Điều đó đủ nhanh chóng, và khi đã xong, chúng ta có thể chuyển sang hàng tiếp theo. Tất nhiên, nếu MI "thẳng đứng" về bản chất thì chúng ta đã hết may mắn. Trong trường hợp đó, có lẽ cách tiếp cận mà Alexanderr đã đề cập?
t0x1n

Giải pháp tuyệt vời, +1! Có thể đặc biệt tiện dụng, vì tôi hiện đang sử dụng micegói. Cám ơn vì đã chia sẻ.
Alexanderr Blekh

1
@ t0x1n Tôi đã cập nhật câu trả lời của mình với chức năng trình bao bọc nâng cao hơn theo nhận xét của bạn. Nếu bạn muốn lặn sâu hơn, tôi khuyên bạn nên chơi xung quanh debug()để xem cách thức mice.impute.pmmvà anh chị em của nó làm việc dưới mui xe.
Max Gordon

1
@ t0x1n: Tôi đoán - kiểm tra các giá trị được liệt kê của bạn. Nếu chúng có vẻ không thực tế thì bạn có thể chọn cách tiếp cận của tôi để chỉ áp đặt những thứ ít tập trung vào mô hình. Trong trường hợp của tôi, tôi đã chọn loại trừ những người không có tia X theo dõi vì họ là trung tâm của nghiên cứu và các nghiên cứu không cung cấp các giá trị hợp lý về mặt lâm sàng (chân trở nên dài hơn sau khi gãy xương). Tôi không hoàn toàn hài lòng với điều này nhưng có vẻ như là một sự thỏa hiệp hợp lý.
Max Gordon

8

Điều gần nhất tôi có thể tìm thấy là sự bao gồm thông tin trước của Amelia . Xem chương 4.7 trong phần họa tiết , cụ thể là 4.7.2:

Linh mục cấp quan sát

Các nhà nghiên cứu thường có thêm thông tin trước về các giá trị dữ liệu bị thiếu dựa trên nghiên cứu trước đó, sự đồng thuận trong học tập hoặc kinh nghiệm cá nhân. Amelia có thể kết hợp thông tin này để tạo ra các cuộc tranh luận được cải thiện rất nhiều. Thuật toán Amelia cho phép người dùng bao gồm các linh mục Bayes thông tin về các ô dữ liệu bị thiếu riêng lẻ thay vì các tham số mô hình tổng quát hơn, nhiều trong số đó có rất ít ý nghĩa trực tiếp.

Sự kết hợp của các linh mục theo phân tích Bayes cơ bản trong đó việc cắt bỏ hóa ra là trung bình có trọng số của việc loại bỏ dựa trên mô hình và giá trị trung bình trước đó, trong đó các trọng số là các hàm của cường độ tương đối của dữ liệu và trước đó: khi mô hình dự đoán rất tốt , việc buộc tội sẽ giảm trọng lượng trước và ngược lại (Honaker và King, 2010).

Các linh mục về các quan sát riêng lẻ nên mô tả niềm tin của nhà phân tích về việc phân phối tế bào dữ liệu bị thiếu. Điều này có thể có dạng trung bình và độ lệch chuẩn hoặc khoảng cách chia. Ví dụ, chúng ta có thể biết rằng tỷ lệ tari năm 1986 ở Thái Lan khoảng 40%, nhưng chúng ta có một số điểm không chắc chắn về giá trị chính xác. Sau đó, niềm tin trước đây của chúng tôi về việc phân phối ô dữ liệu bị thiếu, sau đó, tập trung vào 40 với độ lệch chuẩn phản ánh mức độ không chắc chắn mà chúng tôi có về niềm tin trước đây của mình.

Để nhập các mục sư, bạn phải xây dựng một ma trận mục sư với bốn hoặc năm cột. Mỗi hàng của ma trận đại diện cho một ưu tiên trên một quan sát hoặc một biến. Trong bất kỳ hàng nào, mục nhập trong cột đầu tiên là hàng của quan sát và mục nhập là cột thứ hai là cột của quan sát. Trong ma trận bốn cột, ma trận cột thứ ba và thứ tư là độ lệch trung bình và độ lệch chuẩn của phân bố trước của giá trị còn thiếu.

Vì vậy, trong khi bạn thường không thể nói điều gì đó giống như x1<x2+x3, bạn có thể lặp lại tập dữ liệu của mình và thêm mức độ quan sát trước cho từng trường hợp liên quan. Giới hạn không đổi cũng có thể được áp dụng (chẳng hạn như đặt x1, x2 và x3 thành không âm). Ví dụ:

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

Các ràng buộc có lẽ dễ thực hiện hơn trong ý nghĩa dự đoán phù hợp với nhiều lần cắt ngang. Điều này giả định rằng có một số lượng đáng kể các quan sát với các biến ràng buộc không thiếu đáp ứng các ràng buộc. Tôi đang suy nghĩ về việc thực hiện điều này trong chức năng Hmiscgói R. aregImputeBạn có thể muốn kiểm tra lại sau một tháng nữa. Điều quan trọng là phải xác định khoảng cách tối đa từ mục tiêu mà một nhà tài trợ có thể quan sát được, bởi vì các ràng buộc sẽ đẩy các nhà tài trợ đi xa hơn từ nhà tài trợ không bị ràng buộc lý tưởng.


Tôi cũng thích có cái này Tôi chỉ cần các ràng buộc liên biến cơ bản nhất, nói x<y<z.
t0x1n

Tha thứ cho sự thiếu hiểu biết của tôi nếu tôi thoát ra, nhưng tôi có ấn tượng rằng nhiều kỹ thuật cắt ngang liên quan đến việc rút ra các giá trị từ một phân phối thích hợp. Không nên là một vấn đề đơn giản sau đó sử dụng lấy mẫu từ chối? ví dụ: tiếp tục vẽ cho đến khi một số ràng buộc cụ thể (như x1<x2) được đáp ứng?
t0x1n

Đó là những gì tôi có thể làm với aregImputehàm R với kết hợp trung bình dự đoán. Nhưng điều gì sẽ xảy ra nếu không có quan sát nào của nhà tài trợ (gần khớp với dự đoán) thỏa mãn các ràng buộc cho quan sát mục tiêu bị tranh chấp mặc dù rõ ràng họ phải đáp ứng các ràng buộc đối với tập hợp các biến của nhà tài trợ?
Frank Harrell

Trong trường hợp như vậy, có lẽ lấy giá trị dự đoán trực tiếp? Điều đó chỉ dựa vào hồi quy (không có pha PMM) cho một mẫu như vậy?
t0x1n

Khử nhiễu hồi quy có nhiều khả năng đưa ra các giá trị bị loại bỏ không phù hợp với phần còn lại của hồ sơ của đối tượng. Vì vậy, tôi không nghĩ rằng đây là một lý do để tránh PMM.
Frank Harrell

4

Tôi tin rằng gói Amelia(Amelia II) hiện có hỗ trợ toàn diện nhất để chỉ định các ràng buộc phạm vi giá trị dữ liệu. Tuy nhiên, vấn đề là Ameliagiả định rằng dữ liệu là đa biến bình thường.

Nếu trong trường hợp của bạn, giả định về tính quy tắc đa biến không được áp dụng, bạn có thể muốn kiểm tra micegói, thực hiện nhiều lần cắt ngang (MI) thông qua các phương trình xích . Gói này không có giả định về tính quy tắc đa biến . Nó cũng có một chức năng có thể đủ để chỉ định các ràng buộc , nhưng tôi không chắc ở mức độ nào. Hàm được gọi squeeze(). Bạn có thể đọc về nó trong tài liệu: http://cran.r-project.org/web/packages/mice/mice.pdf . Một lợi ích bổ sung của micenó là tính linh hoạt của nó trong việc cho phép đặc tả các chức năng từ chối do người dùng định nghĩa và lựa chọn thuật toán rộng hơn. Đây là một hướng dẫn về thực hiện MI, sử dụngmice :http://www.ats.ucla.edu/stat/r/faq/R_pmm_mi.htm .

Theo như tôi hiểu, Hmiscgói của Tiến sĩ Harrell , sử dụng cùng phương pháp chuỗi ( phương pháp khớp trung bình dự đoán ), có thể hỗ trợ dữ liệu không bình thường (ngoại trừ normpmmphương pháp). Có lẽ anh ta đã thực hiện các chức năng đặc tả ràng buộc theo câu trả lời của mình ở trên. Tôi chưa sử dụng aregImpute(), vì vậy tôi không thể nói nhiều hơn về nó (Tôi đã sử dụng Ameliamice, nhưng tôi chắc chắn không phải là chuyên gia về thống kê, chỉ cố gắng học nhiều nhất có thể).

Cuối cùng, bạn có thể thấy thú vị như sau, một chút về ngày tháng, nhưng vẫn hay, tổng quan về các cách tiếp cận, phương pháp và phần mềm để đa dạng hóa dữ liệu với các giá trị bị thiếu: http://www.ncbi.nlm.nih.gov/pmc/articles / PMC1839993 . Tôi chắc chắn rằng có những bài viết tổng quan mới hơn về MI, nhưng đó là tất cả những gì tôi biết ở thời điểm hiện tại. Tôi hy vọng rằng điều này là phần nào hữu ích.


1
Nhận xét tốt đẹp này khiến tôi nghĩ rằng kết hợp có nghĩa dự đoán, thay thế các sai sót bằng các giá trị thực sự quan sát được, có thể đã kết hợp một số loại chống chỉ định nếu tất cả dữ liệu được quan sát đáp ứng các ràng buộc đó. Tôi sẽ đánh giá cao ai đó nghĩ về điều này thông qua. Tôi chưa thực hiện bất kỳ ràng buộc đặc biệt trong aregImpute.
Frank Harrell

1
Bạn đúng rồi. Tôi chỉ nhận ra rằng các quan sát của nhà tài trợ cung cấp các giá trị phù hợp với các biến khác của họ nhưng không phải với các biến khác trong biến mục tiêu.
Frank Harrell

1
Ngoài các giả định phân phối do Amelia đưa ra, bạn có bất kỳ cơ hội nào có thể chỉ định các ràng buộc chi tiết hơn tôi đã chứng minh trong câu trả lời của tôi không? Vấn đề với squeezelà giới hạn của nó là không đổi, vì vậy bạn không thể chỉ định bất cứ điều gì như x1<x2. Ngoài ra, nó dường như được gọi trên vectơ kết quả bị bỏ qua, mà tôi tin là quá muộn. Dường như với tôi rằng các giới hạn nên được xem xét trong quá trình cắt bỏ, vì vậy chúng có ý nghĩa hơn là một sự điều chỉnh sau thực tế.
t0x1n

1
@ t0x1n: Thật không may, tôi không có cơ hội chỉ định các ràng buộc Ameliavì tôi đã chuyển từ nó sang mice, ngay khi các thử nghiệm của tôi xác nhận rằng dữ liệu của tôi không đa biến thông thường. Tuy nhiên, gần đây tôi đã chạy qua bộ slide trình bày rất hay này về chủ đề (phương pháp và phần mềm MI): statistik.lmu.de/~fkreuter/imputation_sose2011/doads/ . Nếu tôi hiểu chính xác, nó mô tả một giải pháp tiềm năng cho vấn đề ràng buộc (xem trang 50 của PDF - không phải là số 50!). Hi vọng điêu nay co ich.
Alexanderr Blekh

1
@ t0x1n: Trên thực tế, giải pháp được mô tả ở trang 50 và 51.
Aleksandr Blekh

0

Nếu tôi hiểu chính xác câu hỏi của bạn, có vẻ như tôi đã biết những giá trị nào mà các biến còn thiếu sẽ phải chịu một số ràng buộc. Tôi không nói nhiều về SPSS nhưng trong RI nghĩ rằng bạn có thể viết một hàm để làm điều đó (điều này không quá khó tùy thuộc vào kinh nghiệm của bạn mà tôi nên nói). Tôi không biết bất kỳ gói nào hoạt động với các ràng buộc như vậy.

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.