Làm thế nào để thực hiện việc cắt bỏ các giá trị trong số lượng điểm dữ liệu rất lớn?


12

Tôi có một bộ dữ liệu rất lớn và thiếu khoảng 5% giá trị ngẫu nhiên. Các biến này có mối tương quan với nhau. Ví dụ R tập dữ liệu sau đây chỉ là một ví dụ đồ chơi với dữ liệu tương quan giả.

set.seed(123)

# matrix of X variable 
xmat <- matrix(sample(-1:1, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
#M variables are correlated 

N <- 2000000*0.05 # 5% random missing values 
inds <- round ( runif(N, 1, length(xmat)) )
xmat[inds] <- NA 
> xmat[1:10,1:10]
         M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
sample1  -1 -1  1 NA  0 -1  1 -1  0  -1
sample2   1  1 -1  1  0  0  1 -1 -1   1
sample3   0  0  1 -1 -1 -1  0 -1 -1  -1
sample4   1  0  0 -1 -1  1  1  0  1   1
sample5  NA  0  0 -1 -1  1  0 NA  1  NA
sample6  -1  1  0  1  1  0  1  1 -1  -1
sample7  NA  0  1 -1  0  1 -1  0  1  NA
sample8   1 -1 -1  1  0 -1 -1  1 -1   0
sample9   0 -1  0 -1  1 -1  1 NA  0   1
sample10  0 -1  1  0  1  0  0  1 NA   0

Có cách nào (tốt nhất) để áp đặt các giá trị còn thiếu trong tình huống này không? Thuật toán Random Forest có hữu ích không? Bất kỳ giải pháp làm việc trong R sẽ được nhiều đánh giá cao.

Chỉnh sửa:

(1) giá trị Thiếu được phân phối ngẫu nhiên giữa các biến và samples.As số biếnrất lớn (ở đây trong ví dụ - 10000), trong khi số lượng mẫu là nhỏ ở đây trong ví dụ giả ở trên nó là khoảng 200. Vì vậy, khi chúng tôi xem xét bất kỳ mẫu nào trên tất cả các biến (10000), có nhiều khả năng sẽ thiếu giá trị ở một số biến - do số lượng biến lớn. Vì vậy, chỉ cần xóa mẫu không phải là tùy chọn.

(2) Biến có thể được coi là cả định lượng hoặc định tính (nhị phân) trong quá trình xử lý. Phán quyết duy nhất là chúng ta có thể dự đoán nó tốt như thế nào (độ chính xác). Vì vậy, các dự đoán như 0,98 thay vì 1 có thể được chấp nhận thay vì 0 so với 1 hoặc -1 so với 1. Tôi có thể cần phải đánh đổi giữa thời gian tính toán và độ chính xác.

(3) Vấn đề tôi nghĩ là làm thế nào quá mức có thể ảnh hưởng đến kết quả vì số lượng biến lớn so với số lượng mẫu.

(4) Vì tổng số lượng giá trị thiếu là khoảng 5% và là ngẫu nhiên (không tập trung ở bất kỳ biến hoặc mẫu nào vì đã đề phòng để loại bỏ các biến hoặc mẫu có giá trị thiếu rất cao)

(5) Làm cho dữ liệu hoàn chỉnh để phân tích là mục tiêu đầu tiên và độ chính xác là thứ yếu. Vì vậy, không quá nhạy cảm với độ chính xác.

r  random-forest  missing-data  data-imputation  multiple-imputation  large-data  definition  moving-window  self-study  categorical-data  econometrics  standard-error  regression-coefficients  normal-distribution  pdf  lognormal  regression  python  scikit-learn  interpolation  r  self-study  poisson-distribution  chi-squared  matlab  matrix  r  modeling  multinomial  mlogit  choice  monte-carlo  indicator-function  r  aic  garch  likelihood  r  regression  repeated-measures  simulation  multilevel-analysis  chi-squared  expected-value  multinomial  yates-correction  classification  regression  self-study  repeated-measures  references  residuals  confidence-interval  bootstrap  normality-assumption  resampling  entropy  cauchy  clustering  k-means  r  clustering  categorical-data  continuous-data  r  hypothesis-testing  nonparametric  probability  bayesian  pdf  distributions  exponential  repeated-measures  random-effects-model  non-independent  regression  error  regression-to-the-mean  correlation  group-differences  post-hoc  neural-networks  r  time-series  t-test  p-value  normalization  probability  moments  mgf  time-series  model  seasonality  r  anova  generalized-linear-model  proportion  percentage  nonparametric  ranks  weighted-regression  variogram  classification  neural-networks  fuzzy  variance  dimensionality-reduction  confidence-interval  proportion  z-test  r  self-study  pdf 

1
Lý do tại sao dữ liệu bị thiếu mạnh mẽ vào việc lựa chọn kỹ thuật thích hợp. Chẳng hạn, nếu dữ liệu bị thiếu hoàn toàn một cách ngẫu nhiên, bạn sẽ mất ít bằng cách bỏ tất cả các trường hợp có giá trị bị thiếu (vì tập dữ liệu lớn và tương đối ít giá trị bị thiếu); nhưng nếu sự thiếu sót có liên quan đến các biến quan trọng trong phân tích, việc loại bỏ các trường hợp đó có thể đưa ra sai lệch.
whuber

1
@whuber Tôi đồng ý, không thể xóa dữ liệu có kích thước này vì mọi trường hợp sẽ có một giá trị bị thiếu ít nhất tại một biến. Điều này sẽ gây mất hoàn toàn dữ liệu.
John

4
Điều đó thay đổi đáng kể câu hỏi, John, bởi vì ở dạng hiện tại, nó nói rõ ràng khác: nó khẳng định rằng chỉ có 5% giá trị bị thiếu. Ngay cả khi chúng tôi hiểu 5% để áp dụng cho tất cả các mục trong ma trận dữ liệu, thay vì 5% các trường hợp, bất kỳ ai lấy ví dụ này chỉ ra bản chất của dữ liệu của bạn sẽ kết luận hợp lệ rằng không quá 10 * 5% = 50 % các trường hợp có giá trị thiếu. Ba điều quan trọng nhất để mô tả trong các câu hỏi như vậy là (1) mục đích của phân tích, (2) bản chất của sự thiếu sót và (3) số lượng thiếu.
whuber

Câu trả lời:


8

Có thể có hai cách xử lý vấn đề lớn (quan sát) mẫu lớn và nhỏ, tùy thuộc vào tình huống và dữ liệu của bạn.

(1) chỉ sử dụng các mẫu (quan sát) làm biến với điều kiện là điểm số giữa các biến là giống nhau hoặc được chuẩn hóa.

(2) Sử dụng các biến làm biến nhưng thực hiện một số lấy mẫu ngẫu nhiên trong khi nhập liệu để biến số đó nhỏ hơn số lượng mẫu và cuối cùng là hợp nhất dữ liệu.

Sau đây là tập luyện, bạn có thể điều chỉnh theo nhu cầu của bạn. Tôi có giả định về biến là liên tục nhưng bạn tập luyện tương tự cho các biến rời rạc. Ở đây tôi đang đưa ra ví dụ nhỏ để kiểm tra nhanh.

Đầu tiên, đối với tập luyện tạo dữ liệu tương quan, ở đây các quan sát (mẫu) có tương quan, có thể thực tế trong các tình huống là các biến được giả định độc lập trong khi các quan sát được tương quan. Nhưng trong các tình huống khác, trong đó cả quan sát và biến đều tương quan.

# example correlated data, correlated by observations 
# number of observations 
nobs = 200
nvars = 100
# number of variables 
# covariance matrix matrixCR to create correlated data 
matrixCR <- matrix(NA, nrow = nobs, ncol = nobs)
diag(matrixCR) <- 1
matrixCR[upper.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[lower.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[1:10,1:10]
L = chol(matrixCR)# Cholesky decomposition
nvars = dim(L)[1]
set.seed(123)
rM = t(L) %*% matrix(rnorm(nvars*nobs), nrow=nvars, ncol=nobs)
rownames(rM) <- paste("V", 1:nvars, sep = "") 
colnames(rM) <- paste("O", 1:nobs, sep = "")
rM[1:10,1:10]



# introduce missing values in random places 
N <- round(nobs*nvars*0.05,0) # 5% random missing values 
set.seed(123)
inds <- round ( runif(N, 1, length(rM)) )
rM1 <- rM
rM1[inds] <- NA

Tôi đang sử dụng missForestgói để buộc tội, phụ thuộc vào randomForestgói để làm như vậy. Bạn có thể thực hiện tính toán song song nếu bạn có số lượng điểm dữ liệu rất lớn để xử lý.

# now use the rM1 matrix in imputation. 
require(missForest)
out.m <- missForest(rM1, maxiter = 10, ntree = 300)
# imputed 
imp.rM1 <- out.m$ximp

Vì đây là tập dữ liệu mô phỏng, chúng tôi có thể ước tính độ chính xác của việc cắt bỏ bằng cách so sánh giá trị ban đầu trước khi thiếu các giá trị được giới thiệu với giá trị.

# actual values that were made missing 
aval <- rM[inds]
impv <- imp.rM1[inds]

# accuracy - defined as correlation between actual (before na introduction) and imputed values 
cor(aval,impv)
[1] 0.6759404

Bạn có thể làm việc xung quanh để tăng độ chính xác. Chúc may mắn !


5

Có đầy đủ các cuốn sách về việc loại bỏ dữ liệu nên rất khó để đưa ra câu trả lời trong khung này.

yx .

y=f(x) được đào tạo và các giá trị còn thiếu được thay thế bằng các giá trị được dự đoán bởi mô hình của chúng tôi. Dữ liệu của bạn dường như được phân loại để rừng ngẫu nhiên có thể là một lựa chọn tốt.

Nếu tập dữ liệu của bạn rất lớn, hãy đảm bảo sử dụng thuật toán nhanh hoặc thuật toán có thể mở rộng.


cảm ơn, bạn có gợi ý về cuốn sách nào không?
Giăng

không có gì đặc biệt nhưng nếu bạn google dữ liệu, bạn có thể tìm thấy rất nhiều thứ
Donbeo

Dù sao, nếu chỉ thiếu một vài giá trị, bạn có thể xóa tất cả các dòng. Từ bộ dữ liệu của bạn
Donbeo

3
Mặc dù bạn luôn có thể xóa các trường hợp có giá trị bị thiếu, đôi khi đó sẽ là một lựa chọn kém, tùy thuộc vào lý do tại sao dữ liệu bị thiếu.
whuber

@whuber Tôi hoàn toàn đồng ý với bạn nhưng rất nhiều lần đây chỉ là sự lựa chọn an toàn hơn.
Donbeo

5

Đây là một câu hỏi thực sự thú vị. Tôi cũng đang tìm kiếm điều tương tự. Trên thực tế, có rất nhiều cách khác nhau để đối phó với nó.

Theo tôi, điều đầu tiên sẽ là xác định loại dữ liệu bạn thiếu - thiếu hoàn toàn ngẫu nhiên (MCAR), thiếu ngẫu nhiên (MAR) hoặc thiếu không ngẫu nhiên (NMAR). Điều này là khó khăn và gây tranh cãi để chứng minh nhưng bài báo này cho thấy một cách thú vị để xem dữ liệu MAR.

Để đối phó với nhiều lần cắt ngang R có một vài gói:

  • MICE (có vẻ rất được sử dụng),
  • randomForest,
  • Hmisc
  • Amelia
  • mi

Đây chỉ là một vài trong số các gói tôi tìm thấy cho đến nay.

MICE cũng đã thực hiện rừng ngẫu nhiên và một vài phương pháp khác, như kết hợp trung bình dự đoán.

Điều này không nhiều nhưng có thể giúp bạn tìm ra một số điều. Ngay sau khi tôi có kết quả hoặc quyết định phương pháp nào tôi sẽ tiến hành, tôi sẽ chỉnh sửa bài đăng.

Chúc may mắn!


Dữ liệu của tôi là MCAR.
Giăng

1
Nếu dữ liệu của bạn là MCAR, bạn chỉ có thể sử dụng phân tích trường hợp hoàn chỉnh. Nhiều tài liệu báo cáo rằng sử dụng phân tích trường hợp hoàn chỉnh với dữ liệu MCAR là giải pháp tốt nhất. Ít nhất, một số bài báo tôi tìm thấy đã báo cáo điều này, ngay cả khi so sánh với các phương pháp
cắt cụt khác

3

Câu hỏi thú vị. Thủ thuật cho vấn đề này là, để thực hiện nhiều lần cắt cụt, bạn cần nhiều hơn là một mô hình dự đoán (có thể dễ dàng có được trong phương pháp học máy). Chúng tôi sẽ gọi các mô hình này mô phỏng các mô hình, vì chúng không hoàn toàn là các mô hình xác suất.

p

  1. Xác định tất cả các mẫu thiếu
  2. Đối với mỗi mẫu, sử dụng phương pháp lựa chọn tính năng Bayes để gán trọng số sau cho các trường hợp hoàn chỉnh trong dữ liệu.
  3. Lấy mẫu ngẫu nhiên các trường hợp hoàn thành lặp đi lặp lại để tạo các khung dữ liệu hoàn chỉnh.

3

Vấn đề của bạn có vẻ phù hợp với một số loại hoàn thành ma trận thứ hạng thấp. Hãy thử sử dụng impute.svd()chức năng từ bcvgói . Tôi sẽ đề nghị sử dụng một thứ hạng nhỏ (đối số k) - đại loại như 5.

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.