এলএম সূত্রে পরিবর্তনশীল বাদ দেওয়া তবুও বিপরীতে ত্রুটি ট্রিগার করে


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
মিঃ ফ্লিক

1
@ এমআরফ্লিক - দেখে মনে হচ্ছে অ-বাস্তবায়িত-ইন-আর neg.out=বিকল্পটি সম্পর্কিত হতে পারে। এর জন্য এস সহায়তা ফাইলগুলি থেকে terms, কোথায় neg.out=এটি প্রয়োগ করা হয়েছে: "-" সাইন দিয়ে শর্তাদি ব্যবহারের চিকিত্সা নিয়ন্ত্রণকারী পতাকা। যদি সত্য হয়, পদগুলি বাতিল করার জন্য পরীক্ষা করা হবে এবং অন্যথায় উপেক্ষা করা হবে। মিথ্যা হলে, নেতিবাচক পদগুলি বজায় রাখা হবে (negativeণাত্মক আদেশ সহ)।
thelatemail

1
@ মউরিটসভার্স: ডেটা সংশোধিত সংস্করণে lmকল model.matrixকরে। খুব শুরুতে, lmরচনা এবং মূল্যায়ন অভিব্যক্তি করুন: mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )। এটি x3একক স্তরের ফ্যাক্টর হওয়ার কারণ হয়। model.matrix()তারপরে বলা হয় mf, মূল ডেটা নয়, ফলস্বরূপ আমরা যে ত্রুটিটি পর্যবেক্ষণ করছি।
আর্টেম সোকোলভ

উত্তর:


2

আপনি যে ত্রুটিটি পাচ্ছেন তা হ'ল x3 কেবলমাত্র একটি মান সহ মডেলটিতে রয়েছে = "men"(@ আর্টেম সোকলভের নীচে মন্তব্য দেখুন)

এটির সমাধানের একটি উপায় হ'ল সময়ের আগে সাবসেট করা:

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 । "মডেলটিতে এক্স 3 ব্যবহার করবেন না" অভিপ্রায়টি সঠিকভাবে জানানো হয়েছে, তবে সমস্যাটি হ'ল lmকলগুলি একটি একক-স্তরের ফ্যাক্টর হয়ে ওঠে model.frame( ..., drop.unused.levels=TRUE )যার ফলে x3ডাউন স্ট্রিম সমস্যার সৃষ্টি হয় model.matrix()
আর্টেম সোকোলভ

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