Çok sayıda veri noktasındaki değerlerin gösterimi nasıl yapılır?


12

Çok büyük bir veri setim var ve yaklaşık% 5 rasgele değerler eksik. Bu değişkenler birbiriyle ilişkilidir. Aşağıdaki örnek R veri kümesi sadece yapay korelasyonlu verilere sahip bir oyuncak örneğidir.

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

Bu durumda eksik değerleri etkilemenin (en iyi) bir yolu var mı? Random Forest algoritması yardımcı oldu mu? R'deki herhangi bir çalışma çözümü çok takdir edilecektir.

Düzenlemeler:

(1) Eksik değerler, değişkenler ve örnekler arasında rastgele dağıtılır . Değişken sayısı çok fazla olduğu için (burada örnekte - 10000), yukarıdaki örnek örnekte örnek sayısı burada azken yaklaşık 200'dür. tüm değişkenler (10000) üzerinden herhangi bir örneğe baktığımızda, çok sayıda değişken nedeniyle bazı değişkenlerde eksik değer bulunma olasılığı yüksektir. Bu yüzden sadece örneği silmek bir seçenek değildir.

(2) Değişken, çarpma işleminde hem nicel hem de nitel (ikili) olarak ele alınabilir. Tek karar, bunu ne kadar iyi tahmin edebileceğimizdir (doğruluk). Bu nedenle, 1 yerine 0,98 gibi tahminler, 0'a 1 ya da -1'e 1 gibi kabul edilebilir.

(3) Değişken sayısının örnek sayısına kıyasla fazla olması nedeniyle aşırı sığmanın sonuçları nasıl etkileyebileceğini düşünüyorum.

(4) Eksik değerlerin toplam miktarı yaklaşık% 5 olduğundan ve rasgele olduğundan (çok yüksek eksik değerlere sahip değişkenleri veya örnekleri kaldırmak için önlem alındığı için herhangi bir değişken veya numunede konsantre edilmemiştir)

(5) Verilerin analiz için eksiksiz hale getirilmesi ilk amaçtır ve doğruluk ikincildir. Bu yüzden hassasiyete çok duyarlı değil.

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
Verilerin eksik olmasının nedeni , uygun tekniğin seçiminde büyük önem taşımaktadır. Örneğin, veriler tamamen rastgele eksikse, eksik değerlere sahip tüm vakaları bırakarak çok az kaybedersiniz (çünkü veri kümesi büyüktür ve nispeten az değer eksiktir); ancak eksiklik analizdeki önemli değişkenlerle ilişkiliyse, bu vakaları bırakmak bir yanlılık yaratabilir.
whuber

1
@whuber katılıyorum, her durumda en az bir değişken eksik bir değere sahip olacağından, bu boyuttaki veri kümesini kaldırmak mümkün değildir. Bu, toplam veri kaybına neden olacaktır.
John

4
Bu, soruyu önemli ölçüde değiştirir, çünkü mevcut haliyle açıkça aksi belirtmektedir: değerlerin sadece% 5'inin eksik olduğunu iddia eder. Vakaların % 5'i yerine, veri matrisindeki tüm girişlere uygulanacak% 5'i anlasak bile , örneği verilerinizin niteliğini gösteren olarak alan herkes , 10 * 5% 'den fazla olmamalıdır = 50 = 50 Vakaların% 'si eksik değerlere sahip. Bu tür sorularda tanımlanması gereken en önemli üç şey (1) analizin amacı, (2) eksikliğin doğası ve (3) eksiklik miktarıdır.
whuber

Yanıtlar:


8

Durumunuza ve veri kümenize bağlı olarak, büyük değişken ve küçük örneklem (gözlem) sorunuyla başa çıkmanın iki yolu olabilir.

(1) değişkenler arasındaki puanların aynı veya normal olması koşuluyla, sadece değişken olarak örnekleri (gözlemleri) kullanın.

(2) Değişkenleri değişken olarak kullanın, ancak sayı değişkeni örnek sayısından daha az olacak ve sonuç olarak verileri birleştirecek şekilde ima ederken rastgele örnekleme yapın.

Aşağıdaki egzersiz, ihtiyacınıza göre ayarlayabilirsiniz. Ben değişken sürekli varsayım var ama ayrık değişkenler için benzer egzersiz. Burada hızlı kontrol için küçük bir örnek veriyorum.

İlk olarak, korelasyonlu veri üreten antrenman için, burada gözlemler (örnekler) korelasyonludur, gözlemler korelasyonlu iken değişkenlerin bağımsız olduğu varsayılan durumlarda gerçekçi olabilir. Ancak hem gözlemlerin hem de değişkenlerin ilişkili olduğu diğer durumlarda.

# 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

Ben bunu yapmak missForestiçin randomForestpakete bağlı imputation için paket kullanıyorum. Belirlenecek çok fazla veri noktanız varsa paralel bilgi işlem yapabilirsiniz.

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

Bu simüle edilmiş veri seti olduğundan, empoze edilen eksik değerlerden önce orijinali karşılaştırarak, impütasyonun doğruluğunu tahmin etme lüksüne sahibiz.

# 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

Doğruluğu artırmak için geçici çözüm bulabilirsiniz. İyi şanslar !


5

Veri ithalatı ile ilgili tam kitaplar vardır, bu nedenle bu çerçevede cevap vermek zordur.

Bu durumda yapılacak en kolay şey, sütunlardan birini ( ) seçmek ve diğerini matrisinde toplamaktır .xyx

Bir modeli eğitilir ve eksik değerler, modelimiz tarafından öngörülen değerlerle değiştirilir. Verileriniz kategorik gibi görünüyor, bu nedenle rastgele orman iyi bir seçim olabilir.y=f(x)

Veri kümeniz çok büyükse, hızlı veya ölçeklenebilir bir algoritma kullandığınızdan emin olun.


teşekkürler, herhangi bir kitap öneriniz var mı?
John

özellikle hiçbir şey. ancak google veri
ithalatı yaparsanız

Her neyse, sadece birkaç değer eksikse, tüm satırı kaldırabilirsiniz. Veri setlerinizden
Donbeo

3
Eksik değerleri olan vakaları her zaman silebilseniz de, verilerin neden eksik olduğuna bağlı olarak bu bazen kötü bir seçim olabilir.
whuber

@whuber Sana tamamen katılıyorum ama çoğu zaman bu sadece daha güvenli bir seçim.
Donbeo

5

Bu gerçekten ilginç bir soru. Ben de aynı şeyi arıyorum. Aslında bununla başa çıkmanın birçok farklı yolu var.

Bence ilk şey ne tür eksik verilerinizin olduğunu belirlemek olacaktır - tamamen rastgele (MCAR) eksik, rastgele (MAR) eksik veya rastgele olmayan (NMAR) eksik. Bunu kanıtlamak zor ve tartışmalıdır, ancak bu makale MAR verilerine bakmak için ilginç bir yol göstermektedir.

Birden fazla itme ile uğraşmak için R'nin birkaç paketi vardır:

  • MICE (çok kullanılmış gibi görünüyor),
  • randomForest,
  • Hmisc
  • Amelia
  • mi

Bunlar şimdiye kadar bulduğum paketlerden sadece birkaçı.

MICE Ayrıca rastgele orman ve tahmini ortalama eşleştirme gibi birkaç yöntem daha uyguladı.

Bu çok değil ama bazı şeyleri anlamanıza yardımcı olabilir. Sonuç alır almaz veya hangi yönteme devam edeceğime karar verir vermez mesajı düzenlerim.

İyi şanslar!


Verilerim MCAR.
John

1
Verileriniz MCAR ise yalnızca tam vaka analizini kullanabilirsiniz. Birçok makale MCAR verileri ile eksiksiz vaka analizi kullanmanın en iyi çözüm olduğunu bildirmektedir. En azından, bulduğum makalelerin bazıları, diğer
impütasyon

3

İlginç soru. Bunun püf noktası, çoklu impütasyon yapmak için, sadece bir tahmin modelinden daha fazlasına ihtiyaç duymanızdır (ki bu bir makine öğrenimi yaklaşımında elde edilmesi kolay / kolay olabilir). Bu modellere model simülasyon modelleri diyeceğiz, çünkü bunlar oldukça olasılık modelleri değil.

Özellik seçiminin (büyük ) ve simüle model eğitiminin birleşik yönü, Bayes yaklaşımının en iyisi olduğunu düşündürüyor. Bu da buna açık bir yaklaşım olmadığı anlamına gelir. Bana göre en iyi yaklaşım aşağıdaki yaklaşıma sahip olacaktır:p

  1. Tüm eksiklik kalıplarını tanımlayın
  2. Her desen için, verilerdeki vakaları tamamlamak üzere arka ağırlıklar atamak için Bayes özellik seçme yaklaşımını kullanın.
  3. Tam veri çerçeveleri oluşturmak için tüm vakaları rasgele bir şekilde örnekleyin.

3

Sorununuz bir tür düşük dereceli matris tamamlanması için özel olarak hazırlanmış gibi görünüyor. Pakettekiimpute.svd() işlevi kullanmayı deneyin . Küçük bir rütbe (argüman ) kullanmanızı öneririm - 5 gibi bir şey.bcvk

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.