วิธีที่ค่า 'NA' ถูกใช้ใน glm ใน R


19

ฉันมีตารางข้อมูล T1 ที่มีเกือบหนึ่งพันตัวแปร (V1) และประมาณ 200 ล้านจุดข้อมูล ข้อมูลเบาบางและรายการส่วนใหญ่เป็น NA แต่ละดาต้าพ้อยท์มี id และคู่ที่ไม่ซ้ำกันเพื่อแยกความแตกต่าง

ฉันมีอีกตาราง T2 ซึ่งมีชุดตัวแปร (V2) แยกกัน ตารางนี้ยังมีคู่ id และวันที่ที่ระบุรายการใน T2 โดยไม่ซ้ำกัน

เราสงสัยว่าข้อมูลใน T1 สามารถใช้ในการทำนายค่าของตัวแปรใน T2

เพื่อพิสูจน์สิ่งนี้ฉันคิดว่าจะใช้โมเดล 'glm' ใน R และตรวจสอบว่าเราสามารถหาตัวแปรใน T2 ที่ขึ้นอยู่กับตัวแปรใน T1 หรือไม่

สำหรับแต่ละตัวแปรใน T2 ฉันเริ่มดึงข้อมูลทั้งหมดใน T1 ที่มี id และคู่วันเดียวกันซึ่งทำให้จุดข้อมูลเล็กกว่า ~ 50K สำหรับตัวแปรทดสอบบางตัว

ปัญหาที่ฉันเผชิญในขณะนี้ด้วยการประยุกต์ใช้ glm มีดังนี้

  1. ในบางกรณีมันแสดงให้ฉันเห็นข้อผิดพลาด 'พอดีไม่พบ' และคำเตือน 'glm.fit: อัลกอริทึมไม่ได้มาบรรจบกัน' ฉันไม่แน่ใจว่าทำไมจึงแสดง

  2. วิธีการรักษา NA ใน glm? มันลบระเบียนทั้งหมดที่เกี่ยวข้องกับ 'NA' ก่อนแล้วจึงทำการปรับแต่งหรือไม่

  3. เป็นกลยุทธ์ที่ดีหรือไม่ที่จะลบ NA ทั้งหมดก่อนแล้วจึงโทร 'glm' ฉันกลัวว่านี่อาจลดดาต้าพอยน์อย่างมีนัยสำคัญเนื่องจากส่วนใหญ่เป็น NAs

  4. ใช้วิธีใดในการคำนวณค่าสัมประสิทธิ์ ฉันไม่สามารถหาเว็บไซต์หรือกระดาษหรือหนังสือใด ๆ ที่กล่าวถึงวิธีคำนวณผลลัพธ์

ฉันทดสอบ glm ทั้งที่มีและไม่มี 'NAs' และพบคำตอบที่แตกต่างกันซึ่งเป็นจุดที่ NAs พิจารณาในขณะที่ปรับข้อมูลให้เหมาะสม

ตัวอย่างที่ 1:

> tmpData
  x1 x2 x3        Y
1  1  1  1        3
2  1  0  4        5
3  1  2  3        6
4  0  3  1        4

Call:  glm(formula = as.formula(paste(dep, " ~ ", paste(xn, collapse = "+"))), 
    na.action = na.exclude)

Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  
                        5.551e-16                          1.000e+00                          1.000e+00  
as.numeric(unlist(tmpData["x3"]))  
                        1.000e+00  

Degrees of Freedom: 3 Total (i.e. Null);  0 Residual
Null Deviance:      5 
Residual Deviance: 9.861e-31    AIC: -260.6 

ตัวอย่างที่ 2:

'x1'    'x2'    'x3'    'Y'
100000  1   NA  2
1   1   1   3
1   NA  -1124   2
1   0   4   5
1   2   3   6
0   3   1   4



Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  as.numeric(unlist(tmpData["x3"]))  
                       -2.3749044                         -0.0000625                          0.6249899                          1.8749937  

Degrees of Freedom: 5 Total (i.e. Null);  2 Residual
Null Deviance:      13.33 
Residual Deviance: 1.875    AIC: 20.05 

คำตอบ:


27

การจัดการ NA:คุณสามารถควบคุมวิธีที่ glm จัดการกับข้อมูลที่ขาดหายไป glm () มีอาร์กิวเมนต์na.actionที่ระบุว่าฟังก์ชันทั่วไปต่อไปนี้ควรใช้โดย glm เพื่อจัดการ NA ในข้อมูล:

  • na.omitและna.exclude: การสังเกตจะถูกลบออกหากมีค่าที่ขาดหายไป ถ้าใช้ na.exclude ฟังก์ชั่นบางอย่างจะนำแผ่นส่วนที่เหลือและการคาดการณ์ความยาวที่ถูกต้องโดยการใส่ NAs สำหรับกรณีที่ละเว้น
  • na.pass: เก็บข้อมูลทั้งหมดรวมถึง NAs
  • na.fail: ส่งคืนวัตถุก็ต่อเมื่อไม่มีค่าที่ขาดหายไป

หากคุณไม่ได้ตั้งค่า na.action, glm () จะตรวจสอบตัวเลือกทั่วไปของ R เพื่อดูว่ามีการตั้งค่าเริ่มต้นไว้ที่นั่นหรือไม่ คุณสามารถเข้าถึงตัวเลือกของคุณด้วยgetOption("na.action")หรือoptions("na.action")และคุณสามารถตั้งค่ามันด้วยยกตัวอย่างเช่นoptions(na.action = "na.omit") แต่จากการส่งออก R ที่คุณให้ในตัวอย่างที่ 1 na.action = na.omitดูเหมือนว่าคุณมีการตั้งค่า ดังนั้นอย่างน้อยในกรณีนั้นอย่างน้อยที่สุดคุณจะลบทุกกรณี / แถวด้วย NAs ก่อนที่จะปรับ ยิ่งไปกว่านั้นฉันค่อนข้างแน่ใจว่าna.action = na.passจะทำให้ glm () ล้มเหลวเมื่อข้อมูลมี NAs (ลองใช้)

ข้อผิดพลาด: glm () กำลังใช้โพรซีเดอร์การวนซ้ำ (วนซ้ำอย่างน้อยกำลังสองน้อยที่สุด; IWLS) เพื่อทำการประมาณค่าความน่าจะเป็นสูงสุด บางครั้งคุณได้รับข้อผิดพลาดเพราะมันจะผ่านจำนวนการทำซ้ำที่กำหนดไว้ล่วงหน้าและถ้ามันไม่ได้พอดีที่ดีก็จะให้ขึ้น หมายเลขนี้จะถูกควบคุมโดย MAXIT maxit = 25อาร์กิวเมนต์ซึ่งโดยเริ่มต้นคือ คุณสามารถลองตั้งค่าให้สูงขึ้นได้ แต่แน่นอนว่าจะใช้เวลานานกว่านี้ (หากคุณตั้งค่าtrace=TRUEมันจะแสดงผลลัพธ์ของการวนซ้ำแต่ละครั้ง)

แหล่งข้อมูลอื่น ๆ : helpfile สำหรับ glm สามารถเข้าถึงได้ด้วย?glmหรือhelp(glm)และอธิบายมากของสิ่งนี้ ทรัพยากรที่มีประโยชน์อีกสองอย่างคือ:

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