การถดถอยโลจิสติกส์: จัดกลุ่มและไม่จัดกลุ่มตัวแปร (ใช้ R)


9

ฉันกำลังอ่าน A. Agresti (2007), การแนะนำการวิเคราะห์ข้อมูลเชิงหมวดหมู่ , อันดับที่ 2 รุ่นและไม่แน่ใจว่าฉันเข้าใจย่อหน้านี้ (หน้า 106, 4.2.1) ถูกต้อง (แม้ว่าควรง่าย):

ในตารางที่ 3.1 เกี่ยวกับการกรนและโรคหัวใจในบทก่อนหน้า 254 คนรายงานการกรนทุกคืนซึ่ง 30 คนเป็นโรคหัวใจ หากไฟล์ข้อมูลมีการจัดกลุ่มข้อมูลไบนารีเส้นหนึ่งในไฟล์ข้อมูลจะรายงานข้อมูลเหล่านี้ว่าเป็นโรคหัวใจ 30 รายจากขนาดตัวอย่าง 254 ถ้าไฟล์ข้อมูลมีข้อมูลไบนารีที่ไม่ได้จัดกลุ่มแต่ละบรรทัดในไฟล์ข้อมูลหมายถึง แยกกันดังนั้น 30 บรรทัดประกอบด้วย 1 สำหรับโรคหัวใจและ 224 บรรทัดประกอบด้วย 0 สำหรับโรคหัวใจ ค่า ML และค่า SE จะเหมือนกันสำหรับไฟล์ข้อมูลทั้งสองประเภท

การแปลงชุดข้อมูลที่ไม่จัดกลุ่ม (ขึ้นอยู่กับ 1 อิสระ 1) จะใช้เวลามากกว่า "บรรทัด" เพื่อรวมข้อมูลทั้งหมด!

ในตัวอย่างต่อไปนี้ชุดข้อมูลแบบง่าย (ไม่สมจริง!) จะถูกสร้างขึ้นและโมเดลการถดถอยแบบโลจิสติกจะถูกสร้าง

ข้อมูลที่จัดกลุ่มจะมีลักษณะอย่างไร (แท็บตัวแปร) รุ่นเดียวกันสามารถสร้างโดยใช้ข้อมูลที่จัดกลุ่มได้อย่างไร

> dat = data.frame(y=c(0,1,0,1,0), x=c(1,1,0,0,0))
> dat
  y x
1 0 1
2 1 1
3 0 0
4 1 0
5 0 0
> tab=table(dat)
> tab
   x
y   0 1
  0 2 1
  1 1 1
> mod1=glm(y~x, data=dat, family=binomial())

คำตอบ:


11

ตารางที่ 3.1 มีการทำซ้ำด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

Agresti พิจารณาคะแนนตัวเลขต่อไปนี้สำหรับระดับการนอนกรน: {0,2,4,5}

มีสองวิธีในการปรับให้เหมาะสมกับ GLM กับ R: ผลลัพธ์ของคุณจะได้รับเป็นเวกเตอร์ที่ 0/1 หรือปัจจัยที่มีสองระดับโดยมีตัวทำนายบน rhs ของสูตรของคุณ หรือคุณสามารถให้เมทริกซ์ที่มีการนับสองคอลัมน์เพื่อความสำเร็จ / ล้มเหลวในรูปของ lhs ของสูตร หลังสอดคล้องกับสิ่งที่ Agresti เรียกข้อมูล 'จัดกลุ่ม' วิธีที่สามซึ่งใช้กับการตั้งค่าที่จัดกลุ่มจะใช้weights=อาร์กิวเมนต์เพื่อระบุจำนวนผลลัพธ์ที่เป็นค่าบวกและลบที่ตรวจพบสำหรับแต่ละหมวดหมู่ของตารางการจำแนกประเภท

ข้อมูลในมุมมองเมทริกซ์จะอ่าน:

snoring <- matrix(c(24,35,21,30,1355,603,192,224), nc=2)

จากนี้เราสามารถสร้างdata.frameรูปแบบยาว (2484 แถว = sum(snoring)การสังเกต) ดังนี้:

snoring.df <- data.frame(snoring=gl(4, 1, labels=c("Never", "Occasional",
                                                   "Nearly every night", 
                                                   "Every night")),
                         disease=gl(2, 4, labels=c("Yes", "No")),
                         counts=as.vector(snoring))
snoring.df <- snoring.df[rep(seq_len(nrow(snoring.df)), snoring.df$counts), 1:2]

และสองโมเดลต่อไปนี้จะให้ผลลัพธ์ที่เหมือนกัน:

levels(snoring.df$snoring) <- c(0, 2, 4, 5)
y <- abs(as.numeric(snoring.df$disease)-2)
x <- as.numeric(as.character(snoring.df$snoring))
fit.glm1 <- glm(y ~ x, family=binomial)

fit.glm2 <- glm(snoring ~ c(0, 2, 4, 5), family=binomial)

นั่นคือโดยใช้สัญลักษณ์ของ Agrestilogit[π^(x)]=-3.87+0.40x

สัญกรณ์ที่สองมักใช้ในตารางรวมพร้อมกับคำสั่งเช่นcbind(a, b)ที่aและbเป็นคอลัมน์ของการนับสำหรับเหตุการณ์ไบนารี (ดูตัวอย่างเช่นโมเดลเชิงเส้นทั่วไป ) ดูเหมือนว่ามันจะทำงานเมื่อใช้ตารางแทนเมทริกซ์ (เช่นในตัวอย่างของคุณ) เช่น

glm(as.table(snoring) ~ c(0, 2, 4, 5), family=binomial)

ขอบคุณมาก! คำตอบที่สมบูรณ์แบบ! ฉันมีการเพิ่มอย่างง่าย ๆ เพียงอย่างเดียว: แทนที่จะเป็น as.table (กรน) ฉันจะแนะนำตาราง (x, y, dnn = c ('การกรน', 'โรค')) แทนตัวอย่างของฉันเพราะการแปลงของ ungrouped เป็นกลุ่ม ข้อมูลก็เป็นที่สนใจเช่นกัน
FloE

1
@FloE คุณพูดถูก คุณจะยังคงต้องสร้างรายงานเฉพาะกิจของคุณ ตัวอย่างเช่นบางสิ่งบางอย่างtab <- table(x,y, dnn=c('snoring','disease')); glm(tab ~ as.numeric(rownames(tab)), family=binomial)จะใช้งานได้ (ลบเครื่องหมายการกลับรายการสำหรับสัมประสิทธิ์เนื่องจาก "ใช่" ถูกเข้ารหัสเป็น 0 แทนที่จะเป็น 1)
chl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.