예 : 이진 결과에 glmnet을 사용하는 LASSO 회귀


77

관심있는 결과가 이분법 인 LASSO Regressionglmnet 과 함께 사용하기 시작했습니다 . 아래에 작은 모의 데이터 프레임을 만들었습니다.

age     <- c(4, 8, 7, 12, 6, 9, 10, 14, 7) 
gender  <- c(1, 0, 1, 1, 1, 0, 1, 0, 0)
bmi_p   <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88)
m_edu   <- c(0, 1, 1, 2, 2, 3, 2, 0, 1)
p_edu   <- c(0, 2, 2, 2, 2, 3, 2, 0, 0)
f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow", 
             "red", "yellow")
asthma  <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)
# df is a data frame for further use!
df <- data.frame(age, gender, bmi_p, m_edu, p_edu, f_color, asthma)

위 데이터 세트의 열 (변수)은 다음과 같습니다.

  • age (연령 어린이 연령)-연속
  • gender -이진 (1 = 남성; 0 = 여성)
  • bmi_p (BMI 백분위 수)-연속
  • m_edu (어머니 최고 교육 수준)-서수 (0 = 고등학교 미만; 1 = 고등학교 졸업장; 2 = 학사 학위; 3 = 학사 학위 후)
  • p_edu (아버지 최고 교육 수준)-서수 (m_edu와 동일)
  • f_color (기본 색상 선호)-공칭 ( "파란색", "빨간색"또는 "노란색")
  • asthma (자식 천식 상태)-이진 (1 = 천식; 0 = 천식 없음)

이 예제의 목적은 6 개 잠재적 인 예측 변수 (목록에서 모델 예측 아이의 천식 상태를 만들 수 LASSO 사용하는 것이다 age, gender, bmi_p, m_edu, p_edu, 및 f_color). 분명히 샘플 크기는 여기서 문제이지만 glmnet결과가 이진 (1 = 천식 일 때 프레임 워크 내에서 다양한 유형의 변수 (예 : 연속, 서수, 공칭 및 이진)를 처리하는 방법에 대한 통찰력을 얻고 싶습니다. ; 0 = 천식 없음).

따라서 R천식 상태를 예측하기 위해 위의 데이터와 함께 LASSO를 사용하는이 모의 예제에 대한 설명과 함께 샘플 스크립트를 기꺼이 제공 합니까? 매우 기본적이지만, 저와 CV의 다른 많은 사람들도 이것을 매우 감사하게 생각합니다!


2
당신이 같은 데이터를 게시하는 경우 더 많은 행운을 얻을 수 있습니다 dput실제 R 객체를; 독자들에게 설탕을 입히지 말고 케이크를 굽지 마십시오!. 예를 들어 R에서 적절한 데이터 프레임을 생성하면 foo의 출력을 질문으로 편집하십시오 dput(foo).
Gavin Simpson

@GavinSimpson 감사합니다! 데이터 프레임으로 게시물을 업데이트 했으므로 설탕을 입히지 않고 케이크를 먹을 수 있기를 바랍니다. :)
Matt Reichenbach

2
BMI 백분위 수를 사용하면 물리 법칙을 무시할 수 있습니다. 비만은 현재의 대상과 비슷한 개인의 수에 따른 것이 아니라 신체 측정 (길이, 부피, 체중)에 따라 개인에게 영향을 미칩니다.
Frank Harrell

3
BMI 백분위 수는 선호하는 측정 항목이 아닙니다. 그러나 CDC 가이드 라인은 키와 몸무게 외에 나이와 성별을 고려하여 20 세 미만의 어린이와 청소년에게 BMI에 대한 BMI 백분위 수 (또한 매우 의심스러운 측정법)를 사용할 것을 권장합니다. 이러한 모든 변수와 데이터 값은이 예제에서 전적으로 고려되었습니다. 이 예제는 빅 데이터를 다룰 때 현재 진행중인 작업을 반영하지 않습니다. 나는 단지 glmnet이진 결과로 작동 하는 예제를보고 싶었습니다 .
Matt Reichenbach

MCP, SCAD 또는 LASSO에 의해 형벌 된 선형 및 로지스틱 회귀 모델에 맞는 ncvreg라는 Patrick Breheny의 패키지를 여기에 연결하십시오. ( cran.r-project.org/web/packages/ncvreg/index.html )
bdeonovic

답변:


100
library(glmnet)

age     <- c(4, 8, 7, 12, 6, 9, 10, 14, 7) 
gender  <- as.factor(c(1, 0, 1, 1, 1, 0, 1, 0, 0))
bmi_p   <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88) 
m_edu   <- as.factor(c(0, 1, 1, 2, 2, 3, 2, 0, 1))
p_edu   <- as.factor(c(0, 2, 2, 2, 2, 3, 2, 0, 0))
f_color <- as.factor(c("blue", "blue", "yellow", "red", "red", "yellow", 
                       "yellow", "red", "yellow"))
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)

xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[, -1]
x        <- as.matrix(data.frame(age, bmi_p, xfactors))

# Note alpha=1 for lasso only and can blend with ridge penalty down to
# alpha=0 ridge only.
glmmod <- glmnet(x, y=as.factor(asthma), alpha=1, family="binomial")

# Plot variable coefficients vs. shrinkage parameter lambda.
plot(glmmod, xvar="lambda")

여기에 이미지 설명을 입력하십시오

범주 형 변수는 일반적으로 먼저 요인으로 변환 된 다음 예측 변수의 더미 변수 행렬이 생성되고 연속 예측 변수와 함께 모형으로 전달됩니다. glmnet은 능선과 올가미 위약금을 모두 사용하지만 둘 중 하나만 설정할 수 있습니다.

일부 결과 :

# Model shown for lambda up to first 3 selected variables.
# Lambda can have manual tuning grid for wider range.

glmmod
# Call:  glmnet(x = x, y = as.factor(asthma), family = "binomial", alpha = 1) 
# 
#        Df    %Dev   Lambda
#   [1,]  0 0.00000 0.273300
#   [2,]  1 0.01955 0.260900
#   [3,]  1 0.03737 0.249000
#   [4,]  1 0.05362 0.237700
#   [5,]  1 0.06847 0.226900
#   [6,]  1 0.08204 0.216600
#   [7,]  1 0.09445 0.206700
#   [8,]  1 0.10580 0.197300
#   [9,]  1 0.11620 0.188400
#  [10,]  3 0.13120 0.179800
#  [11,]  3 0.15390 0.171600
# ...

glmmod에서 계수를 추출 할 수 있습니다. 여기에 3 개의 변수가 선택된 상태로 표시됩니다.

coef(glmmod)[, 10]
#   (Intercept)           age         bmi_p       gender1        m_edu1 
#    0.59445647    0.00000000    0.00000000   -0.01893607    0.00000000 
#        m_edu2        m_edu3        p_edu2        p_edu3    f_colorred 
#    0.00000000    0.00000000   -0.01882883    0.00000000    0.00000000 
# f_coloryellow 
#   -0.77207831 

마지막으로 교차 유효성 검사를 사용하여 람다를 선택할 수도 있습니다.

cv.glmmod <- cv.glmnet(x, y=asthma, alpha=1)
plot(cv.glmmod)

여기에 이미지 설명을 입력하십시오

(best.lambda <- cv.glmmod$lambda.min)
# [1] 0.2732972

4
이것은 내가 +1을 찾던 것과 정확히 일치하는 유일한 질문입니다 .1) 교차 검증 람다 0.2732972로 무엇을 할 수 있습니까? 2) glmmod에서 선택한 변수가 선호하는 색상 (노란색), 성별 및 아버지의 교육 (학사 학위)입니까? 정말 고마워!
Matt Reichenbach

4
1) 교차 검증은 람다 및 계수를 선택하는 데 사용됩니다 (최소 오류시). 이 모형에는 지방 분이 없습니다 (경고도 너무 적습니다). 수축 페널티 (최상의 모델은 인터셉트 만 있음)로 모든 계수가 0으로 줄었고 더 많은 (실제) 관찰로 다시 실행하고 람다 범위를 증가시킬 수 있다고 해석합니다. 2) 예, coef (glmmod) [, 10]을 선택한 예에서는 CV 또는 결과 해석을 통해 모델에 대해 람다를 선택합니다. 문제가 해결되었다고 생각되면 해결 된 것으로 표시 할 수 있습니까? 감사.
pat :

2
이것이 f_color변수를 어떻게 처리하는지 물어볼 수 있습니까 ? 요인 수준 1 ~ 4는 1 ~ 2보다 큰 단계로 간주됩니까, 아니면 모두 동일 가중치, 비 방향성 및 범주 형입니까? (정렬되지 않은 모든 예측 변수가있는 분석에 적용하고 싶습니다.)
beroe

3
라인 xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[,-1]은 범주 변수 f_color ( as.factor이전 라인에서 선언 된대로)를 코딩합니다 . contrasts.arg인수가 제공 되지 않으면 기본 R 더미 변수 코딩을 사용해야합니다 . 이것은 f_color의 모든 레벨이 참조 가중치로 사용되어 인터셉트에 흡수되는 첫 번째 레벨을 제외하고는 동일하게 가중치가 부여되고 방향이 지정되지 않음을 의미합니다.
Alex

1
@Alex는 model.matrix(asthma ~ gender + m_edu + p_edu + f_color + age + bmi_p)[, -1]위의 두 줄과 동일한 결과를 제공 하지 않습니까? 연속 변수를 data.frame? 와 연결하기 위해 추가 단계를 사용하는 이유는 무엇 입니까?
jiggunjer

6

내가 선호하는 방법이므로 패키지 enet을 사용합니다. 좀 더 유연합니다.

install.packages('elasticnet')
library(elasticnet)

age <- c(4,8,7,12,6,9,10,14,7) 
gender <- c(1,0,1,1,1,0,1,0,0)
bmi_p <- c(0.86,0.45,0.99,0.84,0.85,0.67,0.91,0.29,0.88)
m_edu <- c(0,1,1,2,2,3,2,0,1)
p_edu <- c(0,2,2,2,2,3,2,0,0)
#f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow", "red", "yellow")
f_color <- c(0, 0, 1, 2, 2, 1, 1, 2, 1)
asthma <- c(1,1,0,1,0,0,0,1,1)
pred <- cbind(age, gender, bmi_p, m_edu, p_edu, f_color)



enet(x=pred, y=asthma, lambda=0)

4
공유해 주셔서 감사합니다 elasticnet. 그러나 위 R스크립트 의 출력으로 무엇을 만들어야할지 모르겠습니다 . 당신은 명확히 할 수 있습니까? 미리 감사드립니다!
Matt Reichenbach

4

pat에서 제공하는 훌륭한 예제를 확장하기 만하면됩니다. 원래 문제는 수준 사이의 고유 순서 (0 <1 <2 <3)를 갖는 서수 변수 (m_edu, p_edu)를 야기했습니다. pat의 원래 대답에서 나는 이것들이 순서가없는 명목 범주 변수로 취급되었다고 생각합니다. 나는 틀릴 수도 있지만, 이러한 변수는 모델이 고유 순서를 존중하도록 코딩되어야한다고 생각합니다. 이것들이 pat의 대답과 같이 순서가없는 요소가 아닌 순서화 된 요소로 코딩되면 glmnet은 약간 다른 결과를 제공합니다 ... 아래 코드는 순서 변수를 순서화 된 요소로 올바르게 포함한다고 생각하며 약간 다른 결과를 제공합니다.

library(glmnet)

age     <- c(4, 8, 7, 12, 6, 9, 10, 14, 7) 
gender  <- as.factor(c(1, 0, 1, 1, 1, 0, 1, 0, 0))
bmi_p   <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88) 
m_edu   <- factor(c(0, 1, 1, 2, 2, 3, 2, 0, 1), 
                  ordered = TRUE)
p_edu   <- factor(c(0, 2, 2, 2, 2, 3, 2, 0, 0), 
                  levels = c(0, 1, 2, 3), 
                  ordered = TRUE)
f_color <- as.factor(c("blue", "blue", "yellow", "red", "red", 
                       "yellow", "yellow", "red", "yellow"))
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)

xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[, -1]
x        <- as.matrix(data.frame(age, bmi_p, xfactors))

# Note alpha=1 for lasso only and can blend with ridge penalty down to
# alpha=0 ridge only.
glmmod <- glmnet(x, y=as.factor(asthma), alpha=1, family="binomial")

# Plot variable coefficients vs. shrinkage parameter lambda.
plot(glmmod, xvar="lambda")

여기에 이미지 설명을 입력하십시오


1
sometimes_sci, 잘 잡기-이것은 교육 수준 변수를 모델링하는 더 적절한 방법입니다. 당신의 기여에 감사합니다.
Matt Reichenbach

변수에 대한 플롯 범례를 어떻게 추가합니까? 예를 들어이 예에서 빨간색 선은 무엇입니까?
jiggunjer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.