จะทำการใส่ค่าในจุดข้อมูลจำนวนมากได้อย่างไร?


12

ฉันมีชุดข้อมูลที่มีขนาดใหญ่มากและมีค่าสุ่มประมาณ 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

มีวิธี (ที่ดีที่สุด) ในการกำหนดค่าที่ขาดหายไปในสถานการณ์นี้หรือไม่? อัลกอริทึม Random Forest มีประโยชน์หรือไม่ วิธีการทำงานใด ๆ ใน R จะได้รับการชื่นชมมาก

การแก้ไข:

(1) ค่าที่ขาดหายไปจะถูกกระจายแบบสุ่มระหว่างตัวแปรและกลุ่มตัวอย่างเนื่องจากจำนวนตัวแปรมีขนาดใหญ่มาก (ในตัวอย่าง - 10,000) ในขณะที่จำนวนตัวอย่างมีขนาดเล็กในตัวอย่างตัวอย่างด้านบนมันคือประมาณ 200 ดังนั้นเมื่อ เราดูตัวอย่างจากตัวแปรทั้งหมด (10,000) มีโอกาสสูงที่จะมีค่าที่ขาดหายไปในตัวแปรบางตัว - เนื่องจากตัวแปรจำนวนมาก ดังนั้นการลบตัวอย่างไม่ใช่ตัวเลือก

(2) ตัวแปรสามารถถือว่าเป็นทั้งเชิงปริมาณหรือเชิงคุณภาพ (ไบนารี) ในกระบวนการของการใส่ความ การตัดสินเพียงอย่างเดียวคือวิธีที่ดีที่เราสามารถทำนายได้ (ความแม่นยำ) ดังนั้นการคาดการณ์เช่น 0.98 แทนที่จะเป็น 1 อาจยอมรับได้มากกว่า 0 กับ 1 หรือ -1 กับ 1 ฉันอาจต้องแลกเปลี่ยนระหว่างเวลาในการคำนวณและความแม่นยำ

(3) ปัญหาที่ฉันคิดว่าการมีน้ำหนักเกินสามารถส่งผลต่อผลลัพธ์ได้เนื่องจากจำนวนตัวแปรมีขนาดใหญ่เมื่อเทียบกับจำนวนตัวอย่าง

(4) เนื่องจากปริมาณรวมของค่าที่หายไปคือประมาณ 5% และเป็นแบบสุ่ม (ไม่รวมอยู่ในตัวแปรหรือตัวอย่างใด ๆ เนื่องจากมีการใช้ความระมัดระวังเพื่อลบตัวแปรหรือตัวอย่างที่มีค่าที่หายไปสูงมาก)

(5) การทำข้อมูลให้สมบูรณ์เพื่อการวิเคราะห์เป็นวัตถุประสงค์แรกและความแม่นยำเป็นรอง ดังนั้นไม่ไวเกินไปต่อความแม่นยำ

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
เหตุผลที่ว่าทำไมข้อมูลจะหายไปหมีอย่างยิ่งในการเลือกเทคนิคที่เหมาะสม ตัวอย่างเช่นหากข้อมูลหายไปโดยสมบูรณ์แบบสุ่มคุณจะสูญเสียเพียงเล็กน้อยโดยการทิ้งทุกกรณีที่มีค่าหายไป (เนื่องจากชุดข้อมูลมีขนาดใหญ่และค่าที่ค่อนข้างขาดหายไป) แต่หากความหายไปเกี่ยวข้องกับตัวแปรสำคัญในการวิเคราะห์การทิ้งกรณีเหล่านั้นสามารถทำให้เกิดอคติได้
whuber

1
@ เมื่อฉันเห็นด้วยมันเป็นไปไม่ได้ที่จะลบสำหรับชุดข้อมูลขนาดนี้เนื่องจากทุกกรณีจะมีค่าที่ขาดหายไปอย่างน้อยหนึ่งตัวแปร ซึ่งจะทำให้ข้อมูลทั้งหมดสูญหาย
จอห์น

4
นั่นเป็นการเปลี่ยนแปลงคำถามอย่างมากจอห์นเพราะในรูปแบบปัจจุบันมันระบุไว้เป็นอย่างอื่นอย่างชัดเจน: มันอ้างว่ามีเพียง 5% ของค่าที่หายไป แม้ว่าเราจะเข้าใจ 5% ที่จะนำไปใช้กับรายการทั้งหมดในเมทริกซ์ข้อมูลมากกว่า 5% ของทุกกรณีใครก็ตามที่ยกตัวอย่างเป็นตัวบ่งชี้ลักษณะของข้อมูลของคุณจะสรุปได้อย่างถูกต้องว่าไม่เกิน 10 * 5% = 50 % ของเคสมีค่าขาดหายไป สามสิ่งที่สำคัญที่สุดที่จะอธิบายในคำถามดังกล่าวคือ (1) จุดประสงค์ของการวิเคราะห์ (2) ลักษณะของการหายไปและ (3) จำนวนของการหายไป
whuber

คำตอบ:


8

อาจมีสองวิธีในการจัดการกับปัญหาตัวแปรขนาดใหญ่และตัวอย่างขนาดเล็ก (การสังเกต) ขึ้นอยู่กับสถานการณ์และชุดข้อมูลของคุณ

(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

คุณสามารถหลีกเลี่ยงเพื่อเพิ่มความแม่นยำ โชคดี !


5

มีการใส่ข้อมูลแบบเต็มหนังสือดังนั้นจึงเป็นเรื่องยากที่จะให้คำตอบในกรอบนี้

สิ่งที่ง่ายที่สุดที่จะทำในกรณีนี้คือการเลือกอย่างใดอย่างหนึ่งของคอลัมน์ ( ) และเก็บอื่น ๆ ในเมทริกซ์xxyx

แบบจำลองได้รับการฝึกฝนและค่าที่หายไปจะถูกแทนที่ด้วยค่าที่ทำนายโดยแบบจำลองของเรา ข้อมูลของคุณดูเหมือนจะเป็นหมวดหมู่ดังนั้นฟอเรสต์แบบสุ่มอาจเป็นทางเลือกที่ดีy=f(x)

หากชุดข้อมูลของคุณมีขนาดใหญ่มากควรใช้อัลกอริธึมที่รวดเร็วหรือปรับขนาดได้


ขอบคุณคุณมีข้อเสนอแนะหนังสือเล่มใด?
จอห์น

ไม่มีอะไรพิเศษ แต่ถ้าคุณใส่ข้อมูล google คุณสามารถค้นหาสิ่งต่างๆมากมาย
Donbeo

อย่างไรก็ตามถ้ามีค่าน้อยหายไปคุณสามารถลบบรรทัดทั้งหมดได้ จากชุดข้อมูลของคุณ
Donbeo

3
แม้ว่าคุณสามารถลบกรณีที่มีค่าหายไปได้เสมอซึ่งบางครั้งอาจเป็นตัวเลือกที่ไม่ดีขึ้นอยู่กับสาเหตุที่ข้อมูลหายไป
whuber

@ เมื่อฉันเห็นด้วยกับคุณโดยสิ้นเชิง แต่หลายครั้งนี่เป็นเพียงทางเลือกที่ปลอดภัยกว่า
Donbeo

5

นี่เป็นคำถามที่น่าสนใจจริงๆ ฉันกำลังมองหาสิ่งเดียวกัน อันที่จริงมีหลายวิธีที่จะจัดการกับมัน

ในความคิดของฉันสิ่งแรกคือการกำหนดประเภทของข้อมูลที่หายไปที่คุณมี - การสุ่มที่สมบูรณ์ (MCAR) การสุ่มที่ขาดหายไป (MAR) หรือการขาดที่ไม่สุ่ม (NMAR) นี่เป็นเรื่องยากและขัดแย้งเพื่อพิสูจน์ แต่บทความนี้แสดงวิธีที่น่าสนใจในการดูข้อมูล MAR

ในการจัดการกับการใส่ข้อมูลหลายรายการ R มีแพ็คเกจไม่กี่รายการ

  • MICE (ซึ่งดูเหมือนว่าใช้มาก)
  • randomForest,
  • Hmisc
  • Amelia
  • mi

เหล่านี้เป็นแพ็คเกจที่ฉันพบเท่านั้น

MICE ยังใช้ฟอเรสต์แบบสุ่มและวิธีการอื่น ๆ เช่นการจับคู่ค่าเฉลี่ยที่คาดการณ์ได้

มันไม่มาก แต่อาจช่วยให้คุณเข้าใจบางสิ่ง ทันทีที่ฉันได้ผลลัพธ์หรือตัดสินใจด้วยวิธีที่ฉันจะดำเนินการต่อฉันจะแก้ไขโพสต์

โชคดี!


ข้อมูลของฉันคือ MCAR
John

1
หากข้อมูลของคุณคือ MCAR คุณสามารถใช้การวิเคราะห์เคสที่สมบูรณ์เท่านั้น รายงานจำนวนมากรายงานว่าการใช้การวิเคราะห์ตัวพิมพ์เล็กและใหญ่ด้วยข้อมูล MCAR นั้นเป็นทางออกที่ดีที่สุด อย่างน้อยเอกสารที่ฉันพบรายงานนี้แม้เมื่อเปรียบเทียบกับวิธีการใส่ร้ายอื่น ๆ
psoares

3

คำถามที่น่าสนใจ เคล็ดลับในการทำเช่นนี้คือในการที่จะทำการใส่หลายแบบคุณจำเป็นต้องมีมากกว่าแบบจำลองการทำนาย (ซึ่งอาจเป็น / ง่ายที่จะได้รับในการพูดวิธีการเรียนรู้ของเครื่อง) เราจะเรียกแบบจำลองเหล่านี้ว่าแบบจำลองเนื่องจากมันไม่ใช่แบบจำลองความน่าจะเป็น

p

  1. ระบุรูปแบบการสูญหายทั้งหมด
  2. สำหรับแต่ละรูปแบบให้ใช้วิธีการเลือกคุณลักษณะแบบเบย์เพื่อกำหนดน้ำหนักหลังให้เสร็จสมบูรณ์ในกรณี
  3. สุ่มกรณีตัวอย่างที่สมบูรณ์ซ้ำ ๆ เพื่อสร้างเฟรมข้อมูลที่สมบูรณ์

3

ดูเหมือนว่าปัญหาของคุณจะได้รับการปรับแต่งสำหรับการจัดทำเมทริกซ์ที่มีระดับต่ำ ลองใช้impute.svd()ฟังก์ชั่นจากแพคเกจbcv ฉันขอแนะนำให้ใช้อันดับเล็ก ๆ (อาร์กิวเมนต์k) - บางอย่างเช่น 5

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.