एक ggplot पर एक प्रतिगमन रेखा जोड़ना


120

मैं एक ggplot पर एक प्रतिगमन लाइन जोड़ने के लिए कड़ी मेहनत कर रहा हूँ। मैंने पहली बार abline के साथ प्रयास किया लेकिन मैंने इसे काम करने का प्रबंधन नहीं किया। फिर मैंने यह कोशिश की ...

data = data.frame(x.plot=rep(seq(1,5),10),y.plot=rnorm(50))
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
   geom_smooth(method='lm',formula=data$y.plot~data$x.plot)

लेकिन यह भी काम नहीं कर रहा है।

जवाबों:


170

सामान्य तौर पर, अपने स्वयं के सूत्र प्रदान करने के लिए आपको तर्कों का उपयोग करना चाहिए xऔर yजो आपके द्वारा प्रदान किए गए मूल्यों के अनुरूप होंगे ggplot()- इस मामले xमें x.plotऔर के yरूप में व्याख्या की जाएगी y.plot। सुचारू तरीके और सूत्र के बारे में अधिक जानकारी आप फ़ंक्शन के सहायता पृष्ठ में पा सकते हैं stat_smooth()क्योंकि यह डिफ़ॉल्ट रूप से उपयोग की जाने वाली स्टेट है geom_smooth()

ggplot(data,aes(x.plot, y.plot)) +
  stat_summary(fun.data=mean_cl_normal) + 
  geom_smooth(method='lm', formula= y~x)

यदि आप उसी x और y मान का उपयोग कर रहे हैं जिसे आपने ggplot()कॉल में आपूर्ति की है और रैखिक प्रतिगमन लाइन को प्लॉट करने की आवश्यकता है, तो आपको सूत्र का उपयोग करने की आवश्यकता नहीं है geom_smooth(), बस आपूर्ति करें method="lm"

ggplot(data,aes(x.plot, y.plot)) +
  stat_summary(fun.data= mean_cl_normal) + 
  geom_smooth(method='lm')

46

जैसा कि मैंने अभी पता लगाया है, यदि आपके पास कई रैखिक प्रतिगमन पर फिट किया गया मॉडल है , तो उपर्युक्त समाधान काम नहीं करेगा।

आपको अपनी लाइन मैन्युअल रूप से एक डेटाफ़्रेम के रूप में बनानी होगी जिसमें आपके मूल डेटाफ़्रेम (आपके मामले में data) के लिए अनुमानित मान हों ।

यह इस तरह दिखेगा:

# read dataset
df = mtcars

# create multiple linear model
lm_fit <- lm(mpg ~ cyl + hp, data=df)
summary(lm_fit)

# save predictions of the model in the new data frame 
# together with variable you want to plot against
predicted_df <- data.frame(mpg_pred = predict(lm_fit, df), hp=df$hp)

# this is the predicted line of multiple linear regression
ggplot(data = df, aes(x = mpg, y = hp)) + 
  geom_point(color='blue') +
  geom_line(color='red',data = predicted_df, aes(x=mpg_pred, y=hp))

मल्टीपल एलआर

# this is predicted line comparing only chosen variables
ggplot(data = df, aes(x = mpg, y = hp)) + 
  geom_point(color='blue') +
  geom_smooth(method = "lm", se = FALSE)

सिंगल एलआर


1
देखने के लिए एक बात यह है कि सम्मेलन lm (y ~ x) है। मैं एक दूसरे को पढ़ने के लिए थोड़ा बदल गया क्योंकि चर आप 'भविष्यवाणी कर रहे हैं' x- अक्ष पर है। हालांकि महान जवाब।
कलरलैस

14

उपयोग कर स्पष्ट समाधान geom_abline:

geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])

data.lmएक lmवस्तु कहां है , और data.lm$coefficientsऐसा कुछ दिखता है:

data.lm$coefficients
(Intercept)    DepDelay 
  -2.006045    1.025109 

एक्सप्रेशन के रूप में stat_functionप्रतिगमन रेखा को प्लॉट करने के लिए आइडेंटिकल इन प्रैक्टिस का उपयोग किया जाता है predict:

stat_function(fun = function(x) predict(data.lm, newdata = data.frame(DepDelay=x)))

यह डिफ़ॉल्ट n=101बिंदुओं की गणना के बाद से थोड़ा कम कुशल है, लेकिन बहुत अधिक लचीला है क्योंकि यह किसी भी मॉडल के लिए एक भविष्यवाणी वक्र की साजिश करेगा जो समर्थन करता है predict, जैसे कि npregपैकेज एनपी से गैर-रेखीय ।

नोट: यदि आप उपयोग करते हैं scale_x_continuousया scale_y_continuousकुछ मान कटऑफ हो सकते हैं और इस प्रकार geom_smoothसही ढंग से काम नहीं कर सकते हैं। इसके बजाय ज़ूम करने के लिए उपयोग करेंcoord_cartesian


2
और इसलिए आप अपने फ़ार्मुलों को क्रमबद्ध करने के बारे में कभी चिंता न करें या केवल एक +0नाम जोड़ने से नामों का उपयोग कर सकते हैं। data.lm$coefficients[['(Intercept)']]और data.lm$coefficients[['DepDelay']]
उफ़ोस

(लगभग) हमेशा (Intercept)पहले सूचीबद्ध किया जाएगा। नाम कोड को स्पष्ट करते हैं।
qwr

मुझे लगता है कि यह सबसे अच्छा जवाब है - यह सबसे बहुमुखी है।
arranjdavis

4

मुझे यह फंक्शन एक ब्लॉग पर मिला

 ggplotRegression <- function (fit) {

    `require(ggplot2)

    ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) + 
      geom_point() +
      stat_smooth(method = "lm", col = "red") +
      labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
                         "Intercept =",signif(fit$coef[[1]],5 ),
                         " Slope =",signif(fit$coef[[2]], 5),
                         " P =",signif(summary(fit)$coef[2,4], 5)))
    }`

एक बार जब आप फ़ंक्शन लोड करते हैं तो आप बस कर सकते हैं

ggplotRegression(fit)

आप भी जा सकते हैं ggplotregression( y ~ x + z + Q, data)

उम्मीद है की यह मदद करेगा।


2

यदि आप अन्य प्रकार के मॉडल फिट करना चाहते हैं, जैसे कि लॉजिस्टिक मॉडल का उपयोग करके खुराक-प्रतिक्रिया वक्र तो आपको फ़ंक्शन पूर्वानुमान के साथ अधिक डेटा बिंदु बनाने की आवश्यकता होगी यदि आप एक चिकनी प्रतिगमन रेखा चाहते हैं:

फिट: एक लॉजिस्टिक प्रतिगमन वक्र के अपने फिट

#Create a range of doses:
mm <- data.frame(DOSE = seq(0, max(data$DOSE), length.out = 100))
#Create a new data frame for ggplot using predict and your range of new 
#doses:
fit.ggplot=data.frame(y=predict(fit, newdata=mm),x=mm$DOSE)

ggplot(data=data,aes(x=log10(DOSE),y=log(viability)))+geom_point()+
geom_line(data=fit.ggplot,aes(x=log10(x),y=log(y)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.