如何在大量數據點中執行值的插補?
我有一個非常大的數據集,並且丟失了大約 5% 的隨機值。這些變量相互關聯。以下示例 R 數據集只是一個帶有虛擬相關數據的玩具示例。
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
在這種情況下是否有(最好的)方法來估算缺失值?隨機森林算法有用嗎?R 中的任何工作解決方案將不勝感激。
編輯:
(1) 缺失值隨機分佈在變量和样本之間。由於變量的數量非常****大(示例中為 10000),而上述虛擬示例中的樣本數量較少,約為 200。所以當我們查看所有變量(10000)的任何樣本,由於大量變量,某些變量很可能會出現缺失值。因此,僅刪除樣本不是選項。
(2) 在插補過程中,變量既可以是定量的,也可以是定性的(二元)。唯一的判斷是我們可以預測它有多好(準確性)。因此,像 0.98 而不是 1 這樣的預測可能是可以接受的,而不是 0 vs 1 或 -1 vs 1。我可能需要在計算時間和準確性之間進行權衡。
(3) 我一直在思考過擬合如何影響結果的問題,因為與樣本數量相比,變量的數量很大。
(4)由於缺失值的總量約為5%且是隨機的(未集中在任何變量或樣本中,已採取預防措施去除缺失值非常高的變量或樣本)
(5) 使數據完整分析是第一目標,準確性是第二。所以對準確性不太敏感。
根據您的情況和數據集,可以有兩種方法來處理大變量和小樣本(觀察)問題。
(1)只要跨變量的分數相同或標準化,只需使用樣本(觀察)作為變量。
(2) 使用變量作為變量,但在插補時做一些隨機抽樣,使數字變量小於樣本數,最後合併數據。
以下是鍛煉,您可以根據自己的需要進行調整。我假設變量是連續的,但您對離散變量進行類似的鍛煉。在這裡,我給出一個快速檢查的小例子。
首先,對於生成相關數據的鍛煉,這裡的觀察(樣本)是相關的,在假設變量獨立而觀察相關的情況下可能是現實的。但在其他情況下,觀察值和變量都相關。
# 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
我正在使用
missForest
包進行估算,這取決於randomForest
包來執行此操作。如果您有大量數據點要估算,您可以進行並行計算。# now use the rM1 matrix in imputation. require(missForest) out.m <- missForest(rM1, maxiter = 10, ntree = 300) # imputed imp.rM1 <- out.m$ximp
由於這是模擬數據集,我們可以通過將引入的原始缺失值與估算值進行比較來估計估算的準確性。
# 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
您可以解決問題以提高準確性。祝你好運 !