কোনও রিগ্রেশন-এ রেফারেন্স হিসাবে নির্দিষ্ট ফ্যাক্টর স্তরটি কীভাবে ব্যবহার করতে আর কে বাধ্য করবেন?


112

আমি যদি কোনও রিগ্রেশনে বাইনারি ব্যাখ্যামূলক ভেরিয়েবল ব্যবহার করি তবে আমি কীভাবে আর কে একটি নির্দিষ্ট স্তরকে রেফারেন্স হিসাবে ব্যবহার করতে বলতে পারি?

এটি ডিফল্টরূপে কিছু স্তর ব্যবহার করছে।

lm(x ~ y + as.factor(b)) 

সঙ্গে b {0, 1, 2, 3, 4}। ধরা যাক আর এর দ্বারা ব্যবহৃত শূন্যের পরিবর্তে আমি 3 ব্যবহার করতে চাই want


9
মডেল সূত্র / ফিটিংয়ের বাইরে আপনার ডেটা প্রসেসিং স্টেপ করা উচিত। bআপনি থেকে ফ্যাক্টর তৈরি করার সময় ব্যবহার করে স্তরগুলির ক্রম নির্দিষ্ট করতে পারেন factor(b, levels = c(3,1,2,4,5))lm()কলের বাইরে কোনও ডেটা প্রসেসিং পদক্ষেপে এটি করুন। নীচের আমার উত্তরটি relevel()ফাংশনটি ব্যবহার করে যাতে আপনি একটি ফ্যাক্টর তৈরি করতে পারেন এবং তারপরে আপনার প্রয়োজন অনুসারে রেফারেন্স স্তরটি স্থানান্তর করতে পারেন।
গ্যাভিন সিম্পসন

1
আমি আপনার প্রশ্নের উত্তর দিয়েছি। আপনি প্রকৃতপক্ষে রেফারেন্স স্তরটি পরিবর্তন করার পরে, একটিকে ছাড়েন না।
জরিস

আমার প্রশ্নের পুনর্নির্মাণের জন্য THX। আসলে, রিলেভেল () আমি যা খুঁজছিলাম। বিস্তারিত উত্তর এবং উদাহরণের জন্য যদিও Thx। লিনিয়ার-রিগ্রেশন ট্যাগটি কিছুটা বিভ্রান্তিকর কিনা তা আমি নিশ্চিত নই কারণ এটি ডামি ব্যাখ্যাগুলি ব্যবহার করে সমস্ত ধরণের রিগ্রেশনকে প্রযোজ্য ...
ম্যাট ব্যানার্ট

উত্তর:


152

relevel()ফাংশন দেখুন । এখানে একটি উদাহরণ:

set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))
head(DF)
str(DF)

m1 <- lm(y ~ x + b, data = DF)
summary(m1)

এখন ফ্যাক্টর পরিবর্তন bমধ্যে DFব্যবহার দ্বারা relevel()ফাংশন:

DF <- within(DF, b <- relevel(b, ref = 3))
m2 <- lm(y ~ x + b, data = DF)
summary(m2)

মডেলগুলি বিভিন্ন রেফারেন্স স্তর অনুমান করেছে।

> coef(m1)
(Intercept)           x          b2          b3          b4          b5 
  3.2903239   1.4358520   0.6296896   0.3698343   1.0357633   0.4666219 
> coef(m2)
(Intercept)           x          b1          b2          b4          b5 
 3.66015826  1.43585196 -0.36983433  0.25985529  0.66592898  0.09678759

9
আসল ভেরিয়েবলের প্রেজভ করার জন্য, কেবলমাত্র ব্যবহার করবেন না within, তবে df$bR = relevel(df$b, ref=3)
বার্লিনলিও

1
আপনি আপনার সূত্রের অভ্যন্তরে রিলেভেল () ব্যবহার করতে পারেন, আসল ডেটাसेटকে প্রভাবিত করবেন না ...
মেহেদি জেরে

36

অন্যরা relevelকমান্ডটি উল্লেখ করেছেন যা সর্বোত্তম সমাধান হ'ল যদি আপনি আপনার ডেটাতে সমস্ত বিশ্লেষণের জন্য বেস স্তর পরিবর্তন করতে চান (বা ডেটা পরিবর্তন করে বাঁচতে ইচ্ছুক)।

আপনি যদি ডেটা পরিবর্তন করতে না চান (এটি এক সময়ের পরিবর্তন, তবে ভবিষ্যতে আপনি আবারও ডিফল্ট আচরণ চান), তবে আপনি Cবিপরীতে সেট করার জন্য (নোট বড় হাতের) ফাংশনের সংমিশ্রণটি এবং এর contr.treatmentsসাথে ফাংশনটি ব্যবহার করতে পারেন আপনি কোন স্তরটি বেসলাইন হতে চান তা চয়ন করার জন্য বেস আর্গুমেন্ট।

উদাহরণ স্বরূপ:

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )

33

relevel()কমান্ড আপনার প্রশ্নের একটি সাঁটে লেখার পদ্ধতি। এটি যা করে তা ফ্যাক্টরটিকে পুনঃক্রম করতে হয় যাতে রেফ স্তরটি যা হয় তা প্রথম। অতএব, আপনার ফ্যাক্টরের মাত্রাগুলি পুনরায় সাজানো একই প্রভাব ফেলবে তবে আপনাকে আরও নিয়ন্ত্রণ দেয়। সম্ভবত আপনি স্তরটি 3,4,0,1,2 পেতে চেয়েছিলেন। এই ক্ষেত্রে...

bFactor <- factor(b, levels = c(3,4,0,1,2))

আমি এই পদ্ধতিটি পছন্দ করি কারণ আমার কোডে কেবল রেফারেন্সটি ছিল তা নয়, তবে অন্যান্য মানগুলির অবস্থানটি (তার জন্য ফলাফলগুলি দেখার চেয়ে বরং) এটি আমার পক্ষে সহজ।

দ্রষ্টব্য: এটিকে একটি আদেশযুক্ত ফ্যাক্টর হিসাবে তৈরি করবেন না। নির্দিষ্ট অর্ডারযুক্ত একটি ফ্যাক্টর এবং অর্ডার করা ফ্যাক্টর একই জিনিস নয়। lm()আপনি যদি এটি করেন তবে আপনি বহুপদী বিপরীতে চান তা ভাবতে শুরু করতে পারে।


2
বহুপুত্র বিপরীতে, বহুবর্ষীয় রিগ্রেশন নয়।
হ্যাডলি

পরবর্তী সময়ে পুনরুদ্ধার করার পরিবর্তে আপনি যে বিষয়টিকে ফ্যাক্টরটি সংজ্ঞায়িত করেছেন একই সময়ে রেফারেন্স স্তরটি সেট করার কোনও উপায় আছে কি?
ডেভিড ব্রুস বোরেনস্টাইন

31

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমার একটি অনুরূপ সমস্যা ছিল এবং এটি পেয়েছি:

lm(x ~ y + relevel(b, ref = "3")) 

আপনি যা চেয়েছিলেন ঠিক তাই করে।


3
এটি ছিল একটি বড় সাহায্য! শুধুমাত্র সমাধান যা lm () কমান্ডের মধ্যে এটি করার একটি উপায় অন্তর্ভুক্ত করেছিল যা আমার প্রয়োজন মতো ছিল। ধন্যবাদ!
সিপিআরস্ট্রং

3
এটি উপাদানগুলির সাথে কাজ করার একটি খুব নমনীয় উপায়। আমি সত্যটি পছন্দ করি যে as.factor()প্রয়োজনের সাথে আমি এটি একত্রিত করতে পারি , উদাহরণস্বরূপ...+relevel(as.factor(mycol), ref = "myref")+...
পিটার

12

আপনি নিজে থেকে কলামটি কোনও contrastsবৈশিষ্ট্যের সাথে ট্যাগ করতে পারেন যা রিগ্রেশন ফাংশন দ্বারা সম্মানিত বলে মনে হচ্ছে:

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))

1

যারা dplyr / tidyverse সংস্করণ খুঁজছেন তাদের জন্য। গ্যাভিন সিম্পসন সমাধানে বিল্ডিং:

# Create DF
set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))

# Change reference level
DF = DF %>% mutate(b = relevel(b, 3))

m2 <- lm(y ~ x + b, data = DF)
summary(m2)

আমি বিভ্রান্ত করছি কেন তুমি করা কোথা থেকে তুমি ... এই প্রয়োজনীয় কিনা আপনি ব্যবহার "যদি পরিবর্তনশীল একটি ফ্যাক্টর" relevel()বাforcats::fct_relevel()
গ্রেগর টমাস

আপনি সঠিক, ধন্যবাদ! আমি যুক্ত করেছি "আপনি এটিও ব্যবহার করতে পারেন", কারণ, আফাইক, fct_relevel কেবল কারণগুলির সাথে কাজ করে।
গোরকা

2
relevelশুধুমাত্র কারণের সাথে কাজ করে। fct_relevelশুধুমাত্র কারণের সাথে কাজ করে। নাম, এএফআইকে ব্যতীত ফাংশনের মধ্যে কোনও পার্থক্য নেই। "যদি ভেরিয়েবলটি কোনও উপাদান হয় তবে আপনি এটিও ব্যবহার করতে পারেন" বলার fct_relevelঅর্থ বোঝায় যে ভেরিয়েবলটি যদি আপনি ব্যবহার করতে পারেন এমন একটি উপাদানrelevel না হয় তবে এটি সত্য নয়।
গ্রেগর থমাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.