다항식에서 glmnet을 실행할 때 오류 발생


9

이 질문에서 언급 된 문제는 R 패키지 glmnet 버전 1.7.3에서 수정되었습니다.

가족 = 다항식으로 glmnet을 실행하는 데 문제가 있으며 비슷한 문제가 발생하거나 내가 뭘 잘못하고 있는지 말할 수 있습니다.

내 자신의 더미 데이터를 넣을 때 cv.glmnet"작동하지 않았다"라는 말과 달리 실행할 때 "적용 오류 (nz, 1, median) : dim (X)는 양의 길이를 가져야합니다"라는 오류가보고됩니다. 나에게 큰 정보가 아니었다.

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

미묘한 버그가 있습니다.

인공 데이터 세트에서 3 개의 그룹 평균이 일직선 상에 있고 상대적으로 작은 표준 편차를 사용하면 3 개의 그룹이 10 차원 공간에서 선형으로 분리 가능해집니다. 결과적으로, 두 번째 그룹과 관련된 모든 매개 변수 는 모든 대해λ 0으로 추정됩니다 . 검사

coef(glm)

내부적으로 각각의 에 대해 0이 아닌 계수의 수 를 결정 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 에게 문제를보고해야합니다 (그의 이메일은 링크에 나와 있습니다).


신중하고 빠른 답변에 감사드립니다. 당신이 말하는 대부분의 말이 올바른 것 같지만 그 이유가 그것들이 선형으로 분리 가능한지 확실하지 않습니다. 입력에서 rnorm의 sd를 늘리면 오류가 사라집니다.
BenJWoodcroft

1
NRH : 하나는 관련이 없다고 생각합니다. Hastie 교수는 스팸을 초대 할 수있는 이메일을 일반 텍스트로 작성하는 것에 감사하지 않을 것입니다 (물론 확실히 말할 수는 없지만). 귀하의 답변이 매우 도움이
되었으므로

2
@ BenJWoodcroft, 오류를 유발하는 것은 선형 분리가 아니라 선을 따라 세 그룹의 기하학적 구성입니다. 선형 분리 성은 샘플링 된 데이터에서이 조직을보다 명확하게하고 표준 편차를 충분히 높이면 glmnet이 조직을 "발견"하지 않습니다. 두 번째 예제에서 알 수 있듯이 실제로 선형 분리 성이 필요하지 않습니다. 당신은 이메일 주소에 대해 옳습니다. 감사합니다.
NRH

3
또한 glmnet 1.9.8 및 위의 코드가있는 R 3.1.1 및 샘플 데이터와 함께 비네팅에 제공된 코드 에서이 오류가 발생합니다.
user2030668

1
Windows 및 glmnet 2.0-2에서 R 3.2.1을 사용하는 실제 데이터 에서이 오류가 발생합니다. 훈련 데이터에는 229 개의 예측 변수에 대한 449 개의 관측치가 있습니다. 반응 변수에는 9 가지 수준이 있습니다. 진행하는 방법에 대한 제안은 환영합니다.
Kent Johnson

-1

먼저 예를 들어 행렬을 변환하십시오.

숫자에 대한 응답이없는 x. 그 후 모델에 기여하는 중요한 계수는 데이터 구조에서와 같이 검색 열 이름 또는 행 이름으로 찾습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.