একটি উদাহরণ: বাইনারি ফলাফলের জন্য গ্ল্যামনেট ব্যবহার করে লাসো রিগ্রেশন


77

আমি লাসো রিগ্রেশন সহ যেখানে আমার আগ্রহের ফলাফলটি দ্বিধাহীন তা ব্যবহার glmnetকরে ধকল শুরু করছি । আমি নীচে একটি ছোট মক ডেটা ফ্রেম তৈরি করেছি:

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 (বিএমআই পারসেন্টাইল) - অবিচ্ছিন্ন
  • m_edu (মা সর্বোচ্চ শিক্ষার স্তর) - অর্ডিনাল (উচ্চ বিদ্যালয়ের চেয়ে 0 = কম; 1 = উচ্চ বিদ্যালয়ের ডিপ্লোমা; 2 = ব্যাচেলর ডিগ্রি; 3 = স্নাতকোত্তর ডিগ্রি)
  • p_edu (পিতা সর্বোচ্চ শিক্ষার স্তর) - অর্ডিনাল (এম_ইডু হিসাবে একই)
  • f_color (প্রিয় প্রাথমিক রঙ) - নামমাত্র ("নীল", "লাল", বা "হলুদ")
  • asthma (শিশু হাঁপানির স্থিতি) - বাইনারি (1 = হাঁপানি; 0 = হাঁপানি)

এই উদাহরণে লক্ষ্য 6 সম্ভাব্য predictor ভেরিয়েবল (তালিকা থেকে একটি মডেল পূর্বাভাসের শিশু হাঁপানি অবস্থা তৈরি করতে Lasso ব্যবহার করতে হয় age, gender, bmi_p, m_edu, p_edu, এবং f_color)। স্পষ্টতই নমুনার আকার এখানে একটি সমস্যা, তবে আমি glmnetফলাফলটি বাইনারি হওয়ার সময় কাঠামোর মধ্যে বিভিন্ন ধরণের ভেরিয়েবলগুলি (যেমন, ধারাবাহিক, নিয়মিত, নামমাত্র এবং বাইনারি) কীভাবে পরিচালনা করব সে সম্পর্কে আরও অন্তর্দৃষ্টি অর্জনের প্রত্যাশা করছি ( ; 0 = হাঁপানি নেই)।

যেমন, কেউ Rহাঁপানির অবস্থা সম্পর্কে ভবিষ্যদ্বাণী করতে উপরের ডেটা সহ লাসো ব্যবহার করে এই মক উদাহরণটির ব্যাখ্যা সহ একটি নমুনা স্ক্রিপ্ট সরবরাহ করতে ইচ্ছুক হবে ? যদিও খুব বেসিক, আমি জানি আমি এবং সম্ভবত সিভিতে থাকা আরও অনেকেই এর প্রশংসা করবে!


2
আপনি যদি dputকোনও আসল আর অবজেক্টের হিসাবে ডেটা পোস্ট করেন তবে আপনি আরও ভাগ্য পেতে পারেন ; পাঠকদের উপরে ফ্রস্টিং তৈরি করার পাশাপাশি আপনাকে একটি কেক বেক করবেন না! আপনি যদি আরে যথাযথ ডেটা ফ্রেম তৈরি করেন, বলুন foo, তারপরে প্রশ্নটির আউটপুটটি সম্পাদনা করুন dput(foo)
গ্যাভিন সিম্পসন

ধন্যবাদ @ গ্যাভিনসিম্পসন! আমি পোস্টটি একটি ডেটা ফ্রেমের সাহায্যে আপডেট করেছি তাই আশা করি ফ্রস্টিং না করে কিছু কেক খেতে পারব! :)
ম্যাট রেইচেনবাচ

2
বিএমআই পারসেন্টাইল ব্যবহার করে আপনি এক অর্থে পদার্থবিজ্ঞানের আইনকে অস্বীকার করছেন। স্থূলতা শারীরিক পরিমাপ (দৈর্ঘ্য, আয়তন, ওজন) অনুযায়ী ব্যক্তিদেরকে প্রভাবিত করে বর্তমান ব্যক্তির সাথে কতজন ব্যক্তির মিল রয়েছে সে অনুযায়ী নয়, যা পার্সেন্টিলিং করছে।
ফ্র্যাঙ্ক হ্যারেল

3
আমি সম্মত, বিএমআই পারসেন্টাইল কোনও মেট্রিক যা আমি পছন্দ করতে পছন্দ করি না; যাইহোক, সিডিসির গাইডলাইনগুলি উচ্চতা এবং ওজন ছাড়াও বয়স এবং লিঙ্গ বিবেচনায় নেওয়ার কারণে 20 বছরের কম বয়সী শিশু এবং কিশোর-কিশোরীদের জন্য BMI এর চেয়ে বেশি BMI পার্সেন্টাইল ব্যবহার করার পরামর্শ দেয় able এই উদাহরণগুলির জন্য এই সমস্ত ভেরিয়েবল এবং ডেটা মানগুলি পুরোপুরি চিন্তা করা হয়েছিল। আমি বড় ডেটা নিয়ে কাজ করার সাথে এই উদাহরণটি আমার বর্তমান কোনও কাজের প্রতিফলন করে না। আমি কেবল glmnetবাইনারি ফলাফলের সাথে ক্রিয়াকলাপের একটি উদাহরণ দেখতে চাই ।
ম্যাট রেইচেনবাচ

এমসিপি, এসসিএডি, বা ল্যাসো দ্বারা দণ্ডিত লিনিয়ার এবং লজিস্টিক রিগ্রেশন মডেলগুলির সাথে খাপ খায় এমন প্যাট্রিক ব্রেহেনি নামে পরিচিত একটি প্যাকেজ জন্য এখানে প্লাগ করুন। ( 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")

এখানে চিত্র বর্ণনা লিখুন

শ্রেণিবদ্ধ ভেরিয়েবলগুলি সাধারণত প্রথমে উপাদানগুলিতে রূপান্তরিত হয়, তারপরে ভবিষ্যদ্বাণীকারীদের একটি ডামি ভেরিয়েবল ম্যাট্রিক্স তৈরি করা হয় এবং অবিচ্ছিন্ন ভবিষ্যদ্বাণীগুলির সাথে মডেলটিতে প্রেরণ করা হয়। মনে রাখবেন, গ্ল্যামনেট রিজ এবং লাসো উভয়ই পেনাল্টি ব্যবহার করে তবে একা সেট করা যায় to

কিছু ফলাফল:

# 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
# ...

গলমোড থেকে গুণফলগুলি বের করা যেতে পারে। এখানে নির্বাচিত 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) গ্ল্যামোড থেকে, নির্বাচিত পরিবর্তনগুলি প্রিয় রঙ (হলুদ), লিঙ্গ এবং পিতার শিক্ষা (স্নাতক ডিগ্রি) রয়েছে? অনেক ধন্যবাদ!
ম্যাট রেইচেনবাচ

4
1) ক্রস বৈধতা ল্যাম্বদা এবং সহগ বাছাই করতে ব্যবহৃত হয় (ন্যূনতম ত্রুটিতে)। এই মকআপে, স্থানীয় কোনও মিনিট নেই (খুব অল্প পরিমাণের সাথে সম্পর্কিত একটি সতর্কতাও ছিল); আমি ব্যাখ্যা করব যে সমস্ত সহগুণ সংকুচিত জরিমানার সাথে শূন্যে সঙ্কুচিত হয়েছিল (সেরা মডেলটির কেবলমাত্র বিরতি রয়েছে) এবং আরও (বাস্তব) পর্যবেক্ষণের সাথে পুনরায় চালনা করুন এবং ল্যাম্বডা সীমার বৃদ্ধি করতে পারেন। ২) হ্যাঁ, উদাহরণস্বরূপ যেখানে আমি কোফ বেছে নিয়েছি (গ্ল্যামডমড) [, 10] ... আপনি সিভি বা ফলাফলের ব্যাখ্যার মাধ্যমে মডেলটির জন্য ল্যাম্বডা পছন্দ করেন। আপনি যদি মনে করেন যে আমি আপনার প্রশ্নের সমাধান করেছি তবে আপনি কি সমাধান হিসাবে চিহ্নিত করতে পারেন? ধন্যবাদ।
প্যাট

2
আমি কী জিজ্ঞাসা করতে পারি এটি কীভাবে f_colorচলকটি পরিচালনা করে ? 1 থেকে 4 এর ফ্যাক্টর স্তরটি কি 1 থেকে 2 এর বড় পদক্ষেপ হিসাবে বিবেচিত হয়, বা এগুলি কি সমানভাবে ওজনযুক্ত, দিকনির্দেশক এবং শ্রেণিবদ্ধ? (আমি এটি সমস্ত আনর্ডারড ভবিষ্যদ্বাণীগুলির সাথে বিশ্লেষণে প্রয়োগ করতে চাই))
বেরো

3
লাইনটি xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[,-1]শ্রেণিবদ্ধ ভেরিয়েবল f_color ( as.factorআগের লাইনে ঘোষিত হিসাবে ) কোড দেয়। contrasts.argযুক্তি সরবরাহ না করা হলে এটি ডিফল্ট আর ডামি ভেরিয়েবল কোডিং ব্যবহার করা উচিত । এর অর্থ হল প্রথম_এটি রেফারেন্স ক্লাস হিসাবে ব্যবহৃত হয় এবং ইন্টারসেপ্টে সংশ্লেষ করা ছাড়া f_color এর সমস্ত স্তর সমান ওজনযুক্ত এবং অ-দিকনির্দেশক are
অ্যালেক্স

1
@ অ্যালেক্স model.matrix(asthma ~ gender + m_edu + p_edu + f_color + age + bmi_p)[, -1]উপরের দুটি লাইনের একই ফলাফল দিবে না ? অবিচ্ছিন্ন ভেরিয়েবলগুলির সাথে সংযুক্ত করতে অতিরিক্ত পদক্ষেপটি কেন ব্যবহার করবেন data.frame?
জিগগুনজার

6

আমি প্যাকেজ এনেট ব্যবহার করব কারণ এটি আমার প্রিফারড পদ্ধতি। এটি কিছুটা নমনীয়।

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স্ক্রিপ্ট থেকে আউটপুটটি কীভাবে তৈরি করতে হবে তা আমি জানি না । আপনি দয়া করে পরিষ্কার করতে পারেন? আগাম ধন্যবাদ!
ম্যাট রেইচেনবাচ

4

কেবল প্যাট দ্বারা সরবরাহিত দুর্দান্ত উদাহরণটি প্রসারিত করতে। মূল সমস্যাটি স্তরের (0 <1 <2 <3) এর মধ্যে অন্তর্নিহিত ক্রম সহ অর্ডিনাল ভেরিয়েবলগুলি (এম_ইডু, পি_ইডু) ভঙ্গ করেছে। প্যাট এর মূল উত্তরে আমি মনে করি এগুলিকে নামমাত্র শ্রেণীবদ্ধ ভেরিয়েবল হিসাবে বিবেচনা করা হয়েছিল যার মধ্যে কোনও আদেশ নেই। আমি ভুল হতে পারি, তবে আমি বিশ্বাস করি যে এই পরিবর্তনগুলি এমন কোড করা উচিত যাতে মডেলটি তাদের সহজাত ক্রমকে সম্মান করে। যদি এগুলিকে অর্ডারযুক্ত উপাদান হিসাবে কোড করা হয় (প্যাট এর জবাবের তুলনায় অর্ডারড ফ্যাক্টরের চেয়ে) তবে গ্ল্যামনেট কিছুটা আলাদা ফলাফল দেয় ... আমার মনে হয় নীচের কোডটিতে সঠিকভাবে অর্ডিনাল ফ্যাক্টরগুলি অর্ডিনাল ভেরিয়েবলগুলি অন্তর্ভুক্ত করেছে এবং এটি কিছুটা আলাদা ফলাফল দেয়:

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
কখনও কখনও_এসসি, ভাল ক্যাচ - এটি শিক্ষার স্তরের ভেরিয়েবলগুলির মডেল করার আরও উপযুক্ত উপায়। আপনার অবদানের জন্য ধন্যবাদ.
ম্যাট রেইচেনবাচ

কিভাবে ভেরিয়েবলের জন্য প্লট কিংবদন্তি যুক্ত করা যায়? যেমন এই উদাহরণে লাল রেখাটি কী?
জিগগুনজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.