เกิดข้อผิดพลาดเมื่อเรียกใช้ glmnet ใน multinomial [ปิด]


9

ปัญหาที่กล่าวถึงในคำถามนี้ได้รับการแก้ไขในรุ่น 1.7.3 ของแพ็คเกจ glmnet

ฉันมีปัญหาบางอย่างในการใช้ glmnet กับ family = multinomial และสงสัยว่าได้พบสิ่งที่คล้ายกันหรืออาจบอกฉันได้ว่าฉันทำอะไรผิด

เมื่อฉันใส่ข้อมูลจำลองของฉันเองข้อผิดพลาด "ข้อผิดพลาดในการใช้งาน (nz, 1, ค่ามัธยฐาน): สลัว (X) ต้องมีความยาวเป็นบวก" ได้รับรายงานเมื่อฉันทำงานcv.glmnetซึ่งนอกเหนือจากการพูดว่า "มันไม่ทำงาน" ไม่ได้ให้ข้อมูลกับฉันอย่างมหาศาล

y=rep(1:3,20) #=> 60 element vector
set.seed(1011)
x=matrix(y+rnorm(20*3*10,sd=0.4),nrow=60) # 60*10 element matrix
glm = glmnet(x,y,family="multinomial")   #=> returns without error
crossval = cv.glmnet(x,y,family="multinomial")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="class")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="mae")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
cvglm = cv.glmnet(x,y,family="multinomial",lambda=2)   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length

นี่คือคำอธิบายภาพของปัญหาที่ฉันพยายามจะแก้ไข glmnet ถ้ามันช่วย:

my_colours = c('red','green','blue')
plot(x[,1],x[,2],col=my_colours[y])

ฉันสามารถเรียกใช้โค้ดตัวอย่างจากเอกสารแพคเกจซึ่งทำให้ฉันสงสัยว่าฉันเข้าใจผิดบางอย่างหรือมีข้อผิดพลาดใน glmnet

library(glmnet)
set.seed(10101)
n=1000;p=30
x=matrix(rnorm(n*p),n,p) #=> 1000*30 element matrix
beta3=matrix(rnorm(30),10,3)
beta3=rbind(beta3,matrix(0,p-10,3))
f3=x%*% beta3
p3=exp(f3)
p3=p3/apply(p3,1,sum)
g3=rmult(p3) #=> 1000 element vector
set.seed(10101)
cvfit=cv.glmnet(x,g3,family="multinomial")

นี่คือการใช้รุ่น R 2.13.1 (2011-07-08) และ glmnet 1.7.1 ถึงแม้ว่าฉันสามารถสร้างปัญหาเดียวกันบน R 2.14.1 ความคิดใด ๆ ที่ผู้คน?

คำตอบ:


11

มีข้อบกพร่องเล็กน้อยคือ

สิ่งที่เกิดขึ้นมีดังต่อไปนี้: ในชุดข้อมูลเทียมของคุณหมายความว่าทั้งสามกลุ่มอยู่ในบรรทัดและเมื่อใช้ค่าเบี่ยงเบนมาตรฐานที่ค่อนข้างเล็กกลุ่มทั้งสามก็แยกกันเป็นเส้นตรงในพื้นที่ 10 มิติของคุณ ดังนั้นพารามิเตอร์ทั้งหมดที่เกี่ยวข้องกับกลุ่มที่สองจึงประมาณเป็น 0 สำหรับทุกคนλ. ตรวจสอบ

coef(glm)

ภายในcv.glmnetมีการเรียกpredictเพื่อตรวจสอบสำหรับแต่ละλจำนวนสัมประสิทธิ์ที่ไม่เป็นศูนย์ ลอง

predict(glm, type = "nonzero")

โครงสร้างคือจากการอ่านcv.glmnetโค้ดควรเป็นรายการของรายการ แต่รายการที่สองในรายการคือ NULL และไม่ใช่รายการ! สิ่งนี้ทำให้เกิดข้อผิดพลาด มันเกิดขึ้นในบล็อกรหัสนี้จากcv.glmnet

if (inherits(glmnet.object, "multnet")) {
    nz = predict(glmnet.object, type = "nonzero")
    nz = sapply(nz, function(x) sapply(x, length))
    nz = ceiling(apply(nz, 1, median))
}

ผลที่ได้กลับมาจากการที่ทั้งสองซ้อนกันสายไม่ได้เป็นเมทริกซ์ตามที่คาดไว้ในสายสุดท้ายของsapply applyสิ่งนี้สร้างข้อผิดพลาด

มันอาจไม่น่าเป็นไปได้มากที่จะพบข้อผิดพลาดในทางปฏิบัติ แต่แน่นอนว่ารหัสควรมีความทนทานต่อกรณีร้ายแรง คุณควรรายงานปัญหาต่อผู้ดูแลTrevor Hastie (อีเมลของเขาแสดงไว้ที่ลิงก์)


ขอบคุณสำหรับคำตอบที่รอบคอบและรวดเร็ว สิ่งที่คุณพูดส่วนใหญ่ดูเหมือนจะถูกต้อง แต่ฉันไม่แน่ใจว่าเหตุผลนั้นจำเป็นต้องแยกจากกันเป็นเส้นตรง หากคุณเพิ่ม sd ของ rnorm ในอินพุตข้อผิดพลาดจะหายไป:
BenJWoodcroft

1
NRH: หนึ่งความคิดที่ไม่เกี่ยวข้องกัน - ฉันสงสัยว่าศ. Hastie อาจไม่เห็นคุณค่าที่คุณใส่อีเมลของเขาในข้อความธรรมดาอย่างที่มันอาจชวนสแปม (แม้ว่ามันจะเป็นไปไม่ได้ที่จะบอกแน่นอน) ฉันไม่ได้ตั้งใจที่จะฟังเสียงที่รุนแรงเพราะคำตอบของคุณมีประโยชน์มาก ..
BenJWoodcroft

2
@BenJWoodcroft มันไม่ได้เป็นเชิงเส้นแยกเช่นที่ก่อให้เกิดข้อผิดพลาด แต่องค์กรทางเรขาคณิตของทั้งสามกลุ่มตามแนว การแยกเชิงเส้นทำให้องค์กรนี้ชัดเจนมากขึ้นในข้อมูลตัวอย่างและถ้าคุณเพิ่มค่าเบี่ยงเบนมาตรฐานอย่างเพียงพอ glmnet จะไม่ "ค้นหา" องค์กร ตามตัวอย่างที่สองของคุณแสดงว่าคุณไม่จำเป็นต้องมีการแยกเชิงเส้น คุณถูกต้องเกี่ยวกับที่อยู่อีเมลขอบคุณ
NRH

3
ฉันยังได้รับข้อผิดพลาดนี้กับ glmnet 1.9.8 และ R 3.1.1 พร้อมรหัสด้านบนเช่นเดียวกับรหัสที่ให้ไว้ในบทความสั้นที่มีข้อมูลตัวอย่าง
user2030668

1
ฉันเห็นข้อผิดพลาดนี้กับข้อมูลจริงโดยใช้ R 3.2.1 บน Windows และ glmnet 2.0-2 ข้อมูลการฝึกอบรมมีการสังเกต 449 จาก 229 ทำนาย ตัวแปรตอบกลับมี 9 ระดับ ยินดีต้อนรับข้อเสนอแนะเกี่ยวกับวิธีการดำเนินการต่อไป
Kent Johnson

-1

ขั้นแรกให้แปลงเมทริกซ์ของคุณเช่น

x โดยไม่ตอบสนองต่อตัวเลข หลังจากนั้นค่าสัมประสิทธิ์ที่สำคัญที่มีส่วนร่วมในการค้นหาแบบจำลองโดยค้นหา colnames หรือ rownames เช่นเดียวกับในโครงสร้างข้อมูลตัวแปรคือ

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