পিসওয়াস রিগ্রেশন লাইন প্লট করা


10

linesপ্রতিটি বিভাগকে আলাদা আলাদাভাবে প্লট করা বা ব্যবহার করা বাদে এই জাতীয় পিসওয়াস মডেলের রিগ্রেশন লাইনের প্লট করার কোনও উপায় আছে কি geom_smooth(aes(group=Ind), method="lm", fill=FALSE)?

m.sqft <- mean(sqft)
model <- lm(price~sqft+I((sqft-m.sqft)*Ind))
# sqft, price: continuous variables, Ind: if sqft>mean(sqft) then 1 else 0

plot(sqft,price)
abline(reg = model)
Warning message:
In abline(reg = model) :
  only using the first two of 3regression coefficients

ধন্যবাদ.

উত্তর:


6

সহজেই এটি কীভাবে করা যায় তা আমি জানার একমাত্র উপায় হ'ল মডেল থেকে পূর্বাভাসের ব্যাপ্তি sqftএবং প্লট করা। এর সাথে ablineবা এর মতো কোনও সাধারণ উপায় নেই । আপনি সেগমেন্টযুক্ত প্যাকেজটিও দেখে নিতে পারেন যা এই মডেলগুলির সাথে খাপ খায় এবং আপনার জন্য চক্রান্তের অবকাঠামো সরবরাহ করে।

পূর্বাভাস এবং বেস গ্রাফিক্সের মাধ্যমে এটি করা। প্রথমত, কিছু ডামি ডেটা:

set.seed(1)
sqft <- runif(100)
sqft <- ifelse((tmp <- sqft > mean(sqft)), 1, 0) + rnorm(100, sd = 0.5)
price <- 2 + 2.5 * sqft
price <- ifelse(tmp, price, 0) + rnorm(100, sd = 0.6)
DF <- data.frame(sqft = sqft, price = price,
                 Ind = ifelse(sqft > mean(sqft), 1, 0))
rm(price, sqft)
plot(price ~ sqft, data = DF)

মডেল ফিট:

mod <- lm(price~sqft+I((sqft-mean(sqft))*Ind), data = DF)

ভবিষ্যদ্বাণী ও ভবিষ্যদ্বাণী করার জন্য কিছু ডেটা তৈরি করুন:

m.sqft <- with(DF, mean(sqft))
pDF <- with(DF, data.frame(sqft = seq(min(sqft), max(sqft), length = 200)))
pDF <- within(pDF, Ind <- ifelse(sqft > m.sqft, 1, 0))
pDF <- within(pDF, price <- predict(mod, newdata = pDF))

রিগ্রেশন লাইন প্লট করুন:

ylim <- range(pDF$price, DF$price)
xlim <- range(pDF$sqft, DF$sqft)
plot(price ~ sqft, data = DF, ylim = ylim, xlim = xlim)
lines(price ~ sqft, data = pDF, subset = Ind > 0, col = "red", lwd = 2)
lines(price ~ sqft, data = pDF, subset = Ind < 1, col = "red", lwd = 2)

আপনি এটি একটি সাধারণ ফাংশনে কোড করতে পারেন - আপনার কেবল দুটি পূর্ববর্তী কোড খণ্ডের পদক্ষেপগুলি দরকার - যা আপনি এর জায়গায় ব্যবহার করতে পারেন abline:

myabline <- function(model, data, ...) {
    m.sqft <- with(data, mean(sqft))
    pDF <- with(data, data.frame(sqft = seq(min(sqft), max(sqft),
                                            length = 200)))
    pDF <- within(pDF, Ind <- ifelse(sqft > m.sqft, 1, 0))
    pDF <- within(pDF, price <- predict(mod, newdata = pDF))
    lines(price ~ sqft, data = pDF, subset = Ind > 0, ...)
    lines(price ~ sqft, data = pDF, subset = Ind < 1, ...)
    invisible(model)
}

তারপর:

ylim <- range(pDF$price, DF$price)
xlim <- range(pDF$sqft, DF$sqft)
plot(price ~ sqft, data = DF, ylim = ylim, xlim = xlim)
myabline(mod, DF, col = "red", lwd = 2)

বিভাগযুক্ত প্যাকেজ মাধ্যমে

require(segmented)
mod2 <- lm(price ~ sqft, data = DF)
mod.s <- segmented(mod2, seg.Z = ~ sqft, psi = 0.5,
                   control = seg.control(stop.if.error = FALSE))
plot(price ~ sqft, data = DF)
plot(mod.s, add = TRUE)
lines(mod.s, col = "red")

এই ডেটা দিয়ে এটি ব্রেকআপপয়েন্টটি অনুমান করে না mean(sqft), তবে সেই প্যাকেজটিতে থাকা পদ্ধতি plotএবং linesপদ্ধতিগুলি আপনাকে myablineউপযুক্ত lm()মডেল থেকে সরাসরি নির্দেশ দেওয়ার জন্য এই কাজটি করার চেয়ে আরও সাধারণ কিছু প্রয়োগ করতে সহায়তা করতে পারে ।

সম্পাদনা করুন: যদি আপনি ব্রেকপয়েন্টের অবস্থানটি অনুমান করতে বিভাগগুলি চান তবে 'psi'যুক্তিটি এতে সেট করুন NA:

mod.s <- segmented(mod2, seg.Z = ~ sqft, psi = NA,
                   control = seg.control(stop.if.error = FALSE))

তারপরে সেট আপ হওয়ার সাথে এবং কোনটি ডিফল্ট segmentedহবে তার K = 10পরিমাণের চেষ্টা করবে । আরও জন্য দেখুন।sqftKseg.control()10?seg.control


@ গ্যাভিন (+1) আমার চেয়ে অনেক বেশি সম্পূর্ণ প্রতিক্রিয়া; আমি এটা পছন্দ করি.
chl

@ গ্যাভিন "বিভাগিত প্যাকেজটির মাধ্যমে" বিভাগটি আমার ডেটার জন্য কাজ করে না। segmentedকমান্ডটি চালানোর পরে আমি একটি "ব্রেক ব্রেকপয়েন্ট আনুমানিক" পেয়েছি ।
জর্জ ডোনটাস

@ gd047: দুঃখিত, আমি দেখানো কোডটিতে একটি ত্রুটি ছিল। seq.Zআপনার পরিবর্তনশীল (গুলি) এর একতরফা সূত্রের সাথে যুক্তির সরবরাহ করতে হবে যার প্রতিক্রিয়াটির সাথে একটি খণ্ডিত সম্পর্ক রয়েছে। আমি আমার উত্তরটি সম্পাদনা করেছি seq.Z = ~ sqftএবং আপনার জন্য segmentedমানগুলি চয়ন করার বিষয়ে একটি নোট যুক্ত করেছি added psi
গ্যাভিন সিম্পসন

@ gd047 আমি উত্তরটি সরিয়ে ফেলতে চাই কারণ এইটি আপনার মূল প্রশ্নটিকে আরও ভালভাবে সম্বোধন করে। আমার পরিবর্তে এই এক গ্রহণ করতে মন চাইবে?
chl

@chl অবশ্যই, যদিও আমি এখনও একটি ত্রুটি পেয়েছি: ত্রুটিটি যদি (মডেল) অবজেক্ট এমএফ মডেল <- : শর্ত দৈর্ঘ্য> 1 এবং কেবলমাত্র প্রথম উপাদানটি ব্যবহার করা হবেmodel<mf:argumentisnotinterpretableaslogicalInaddition:Warningmessage:Inif(model)objF
জর্জ ডন্টাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.