एक टुकड़ा रंजकता रेखा प्लॉटिंग


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()मॉडल से diretcly ।

संपादित करें: यदि आप ब्रेकपॉइंट के स्थान का अनुमान लगाना चाहते हैं, तो इसके लिए 'psi'तर्क सेट करें NA:

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

फिर segmentedकी K = 10मात्राओं की कोशिश करेगा sqft, जिसमें Kसेट किया जा सकता है seg.control()और जो चूक करता है 10?seg.controlअधिक के लिए देखें ।


@ गेविन (+1) मेरी तुलना में कहीं अधिक पूर्ण प्रतिक्रिया; मुझे यह बस अच्छा लगता है।
CHL

@Gavin "खंडित पैकेज के माध्यम से" खंड मेरे डेटा के लिए काम नहीं किया। segmentedकमांड चलाने के बाद मुझे "नो ब्रेकप्वाइंट अनुमानित" मिला ।
जॉर्ज डोंटास

@ gd047: माफी, मेरे द्वारा दिखाए गए कोड में एक त्रुटि थी। आपको seq.Zचर के एक पक्षीय सूत्र के साथ तर्क की आपूर्ति करने की आवश्यकता है जो प्रतिक्रिया के साथ खंडित संबंध रखते हैं। मैंने आपके उत्तर को शामिल करने के लिए अपना उत्तर संपादित किया है seq.Z = ~ sqftऔर आपके लिए segmentedमान चुनने के बारे में एक नोट जोड़ा है psi
गैविन सिम्पसन

@ gd047 मैं अपना उत्तर निकालना चाहूंगा क्योंकि यह आपके मूल प्रश्न को अधिक बेहतर तरीके से संबोधित करता है। क्या मेरे बजाय यह स्वीकार करना अच्छा होगा?
CHL

model<mf:argumentisnotinterpretableaslogicalInaddition:Warningmessage:Inif(model)objF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.