Lm फॉर्मूला में चर को छोड़ने के बाद भी विपरीत त्रुटि उत्पन्न होती है


9

मैं अपने डेटा के केवल सबसेट पर lm () चलाने की कोशिश कर रहा हूं, और एक समस्या में चल रहा हूं।

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

lm( y ~ ., dt) # Use all x: Works
lm( y ~ ., dt[x3 == 'men']) # Use all x, limit to men: doesn't work (as expected)

ऊपर काम नहीं करता है क्योंकि डेटासेट में अब केवल पुरुष हैं, और इसलिए हम मॉडल में x3, लिंग चर को शामिल नहीं कर सकते हैं। परंतु...

lm( y ~ . -x3, dt[x3 == 'men']) # Exclude x3, limit to men: STILL doesn't work
lm( y ~ x1 + x2, dt[x3 == 'men']) # Exclude x3, with different notation: works great

यह सूत्र में "माइनस साइन" अंकन के साथ एक मुद्दा है? कृपया सलाह दें। नोट: बेशक मैं इसे एक अलग तरीके से कर सकता हूं; उदाहरण के लिए, मैं चर को lm () में डालने से पहले बाहर कर सकता हूं। लेकिन मैं इस सामान पर एक कक्षा पढ़ा रहा हूं, और मैं छात्रों को भ्रमित नहीं करना चाहता, पहले से ही उन्हें बताया कि वे सूत्र में ऋण चिह्न का उपयोग करके चर को बाहर कर सकते हैं।


3
यह दिलचस्प है कि दोनों model.matrix(y ~ . - x3, data = dt[x3 == "men"])और model.matrix(y ~ x1 + x2, data = dt[x3 == "men"])काम ( आंतरिक रूप से lmकॉल model.matrix)। दोनों मॉडल मैट्रिस के बीच एकमात्र अंतर एक "contrasts"विशेषता है (जिसमें अभी भी समाहित है x3) और जिसे बाद में lmरूटीन के भीतर उठाया जाता है, जिससे आप देख रहे त्रुटि का कारण बन सकते हैं। तो मेरी भावना यह है कि इस मुद्दे को model.matrixडिज़ाइन मैट्रिक्स को कैसे और कैसे संग्रहीत किया जाता है, जब इसे हटा दिया जाता है।
मॉरीशस

मैं "विस्तार" करने की कोशिश कर रहा था, लेकिन इसके .साथ एक सरलीकृत सूत्र प्राप्त करने के लिए, terms(y ~ . -x3, data=dt, simplify=TRUE)लेकिन अजीब तरह से यह अभी भी x3चर विशेषता में बरकरार है जो यात्राएं करता हैlm
MrFlick

1
@MrFlick - ऐसा लगता है कि अनइम्प्लीमेंटेड-इन-आर neg.out=विकल्प संबंधित हो सकता है। एस मदद फ़ाइलों के लिए terms, जहां neg.out=से लागू किया गया है: "-" चिन्ह के साथ प्रवेश करने वाले शब्दों के उपचार को नियंत्रित करने वाला झंडा। यदि सही है, तो शर्तों को रद्द करने और अन्यथा अनदेखा करने के लिए जाँच की जाएगी। यदि FALSE, नकारात्मक शब्दों को बरकरार रखा जाएगा (नकारात्मक क्रम के साथ)।
thelatemail

1
@MauritsEvers: डेटा के एक संशोधित संस्करण पर lmकॉल model.matrixकरता है। बहुत शुरुआत में, lmनिम्नलिखित अभिव्यक्ति का संकलन और मूल्यांकन करता है mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE ):। यह x3एकल-स्तरीय कारक बन जाता है। model.matrix()उसके बाद mfमूल डेटा नहीं बुलाया जाता है , जिसके परिणामस्वरूप हम देख रहे हैं त्रुटि।
आर्टेम सोकोलोव

जवाबों:


2

आपको जो त्रुटि मिल रही है, क्योंकि x3 केवल एक मान के साथ मॉडल में है = "men"(@Artem Sokolov से नीचे टिप्पणी देखें)

इसे हल करने का एक तरीका समय से पहले कम करना है:

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

dmen<-dt[x3 == 'men'] # create a new subsetted dataset with just men

lm( y ~ ., dmen[,-"x3"]) # now drop the x3 column from the dataset (just for the model)

या आप एक ही चरण में दोनों कर सकते हैं:

lm( y ~ ., dt[x3 == 'men',-"x3"])

कुल मिलाकर, यह एक अच्छा समाधान है। सही करने के लिए एक बात यह है कि -x3सूत्र में यह सोचने का कारण नहींlm है कि आप कॉलम को घटाना चाहते हैं। "मॉडल में x3 का उपयोग न करें" इरादे को सही ढंग से संप्रेषित किया जाता है, लेकिन मुद्दा यह है कि lmकॉल एकल-स्तरीय कारक बनने का model.frame( ..., drop.unused.levels=TRUE )कारण बनता x3है, जिससे नीचे की ओर समस्याओं का सामना करना पड़ता है model.matrix()
आर्टेम सोकोलोव

स्पष्टीकरण के लिए धन्यवाद, आर्टेम सोकोलोव, मैंने अपने उत्तर से उस गलत स्पष्टीकरण को ले लिया है।
डायलन_गॉम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.