एक प्रतिगमन में संदर्भ के रूप में निर्दिष्ट कारक स्तर का उपयोग करने के लिए आर को मजबूर कैसे करें?


112

यदि मैं प्रतिगमन में द्विआधारी व्याख्यात्मक चर का उपयोग करता हूं तो मैं संदर्भ के रूप में एक निश्चित स्तर का उपयोग करने के लिए आर को कैसे बता सकता हूं?

यह डिफ़ॉल्ट रूप से कुछ स्तर का उपयोग कर रहा है।

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

के साथ b {0, 1, 2, 3, 4}। मान लीजिए कि मैं आर द्वारा उपयोग किए जाने वाले शून्य के बजाय 3 का उपयोग करना चाहता हूं।


9
आपको मॉडल फॉर्मूला / फिटिंग के बाहर डेटा प्रोसेसिंग स्टेप करना चाहिए। bआपके द्वारा कारक बनाते समय उपयोग किए जा रहे स्तरों के क्रम को निर्दिष्ट कर सकते हैं factor(b, levels = c(3,1,2,4,5))lm()हालांकि कॉल के बाहर डेटा प्रोसेसिंग चरण में ऐसा करें। नीचे मेरा जवाब relevel()फ़ंक्शन का उपयोग करता है ताकि आप एक कारक बना सकें और फिर संदर्भ स्तर को सूट करने के लिए चारों ओर स्थानांतरित कर सकें, जैसा कि आपको आवश्यक है।
गैविन सिम्पसन

1
मैंने आपके प्रश्न का पुन: प्रकाशन किया। आप वास्तव में संदर्भ स्तर को बदलने के बाद, एक को नहीं छोड़ रहे हैं।
जोरिस मेस

मेरे सवाल का जवाब देने के लिए thx। वास्तव में, revelvel () वही था जिसकी मुझे तलाश थी। हालांकि विस्तृत जवाब और उदाहरण के लिए 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में परिवर्तन करें :DFrelevel()

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
मूल चर को preseve करने के लिए, बस का उपयोग न करें within, लेकिन df$bR = relevel(df$b, ref=3)
बर्नलिनियो

1
आप अपने फॉर्मूले के अंदर revelvel () का उपयोग कर सकते हैं, जो मूल डेटासेट को प्रभावित नहीं करेगा ...
Mehdi Zare

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
यह एक बड़ी मदद थी! केवल समाधान जिसमें एलएम () कमांड के भीतर इसे करने का एक तरीका शामिल था, जो वास्तव में मुझे चाहिए था। धन्यवाद!
cparmstrong

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 / साफ संस्करण की तलाश में उन लोगों के लिए। गैविन सिम्पसन समाधान पर निर्माण:

# 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()
ग्रेगर थॉमस

आप सही हैं, धन्यवाद! मैंने जोड़ा "आप भी उपयोग कर सकते हैं", क्योंकि, afaik, fct_relevel केवल कारकों के साथ काम करता है।
गोरका

2
relevelकेवल कारकों के साथ काम करता है। fct_relevelकेवल कारकों के साथ काम करता है। नाम, AFAIK को छोड़कर कार्यों में कोई अंतर नहीं है। यह कहना कि "यदि चर एक कारक है तो आप fct_relevelइसका उपयोग भी कर सकते हैं " का अर्थ है कि यदि चर वह कारक नहीं है जिसका आप उपयोग कर सकते हैं relevel, लेकिन यह सच नहीं है।
ग्रेग थॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.