2016-04-06 8 views
5

मैं ggplot पर जीएलएम से फिट फ़ंक्शन जोड़ना चाहता हूं। डिफ़ॉल्ट रूप से, यह स्वचालित रूप से साक्षात्कार के साथ साजिश बनाते हैं। मैं सोच रहा हूं, अगर मैं बिना किसी बातचीत के मॉडल से फिट फ़ंक्शन प्लॉट कर सकता हूं। उदाहरण के लिए,ggplot जीएलएम बातचीत के बिना फिट वक्र

dta <- read.csv("http://www.ats.ucla.edu/stat/data/poisson_sim.csv") 
dta <- within(dta, { 
    prog <- factor(prog, levels=1:3, labels=c("General", "Academic", "Vocational")) 
    id <- factor(id) 
}) 

plt <- ggplot(dta, aes(math, num_awards, col = prog)) + 
    geom_point(size = 2) + 
    geom_smooth(method = "glm", , se = F, 
     method.args = list(family = "poisson")) 

print(plt) 

बातचीत के साथ साजिश, Fig-1

हालांकि, मैं मॉडल से भूखंड चाहते हैं,

`num_awards` = ß0 + ß1*`math` + ß2*`prog` + error 

मैं इस इस तरह से प्राप्त करने की कोशिश, देता

mod <- glm(num_awards ~ math + prog, data = dta, family = "poisson") 

fun.gen <- function(awd) exp(mod$coef[1] + mod$coef[2] * awd) 
fun.acd <- function(awd) exp(mod$coef[1] + mod$coef[2] * awd + mod$coef[3]) 
fun.voc <- function(awd) exp(mod$coef[1] + mod$coef[2] * awd + mod$coef[4]) 

ggplot(dta, aes(math, num_awards, col = prog)) + 
    geom_point() + 
    stat_function(fun = fun.gen, col = "red") + 
    stat_function(fun = fun.acd, col = "green") + 
    stat_function(fun = fun.voc, col = "blue") + 
    geom_smooth(method = "glm", se = F, 
     method.args = list(family = "poisson"), linetype = "dashed") 

आउटपुट प्लॉट Fig2

क्या यह कुशलतापूर्वक करने के लिए ggplot में कोई आसान तरीका है?

उत्तर

4

ऐसा करने का कोई तरीका नहीं है कि मुझे यह करने में geom_smooth() चालने का कोई तरीका नहीं है, लेकिन आप थोड़ा ऐसा करने से बेहतर कर सकते हैं। तुम अब भी मॉडल अपने आप को फिट और लाइनों को जोड़ने के लिए है, लेकिन आप भविष्यवाणियों पैदा करते हैं और उन्हें मूल डेटा के रूप में एक ही संरचना के साथ एक डेटा फ्रेम में लोड करने predict() विधि का उपयोग कर सकते हैं ...

mod <- glm(num_awards ~ math + prog, data = dta, family = "poisson") 
## generate prediction frame 
pframe <- with(dta, 
      expand.grid(math=seq(min(math),max(math),length=51), 
         prog=levels(prog))) 
## add predicted values (on response scale) to prediction frame 
pframe$num_awards <- predict(mod,newdata=pframe,type="response") 

ggplot(dta, aes(math, num_awards, col = prog)) + 
    geom_point() + 
    geom_smooth(method = "glm", se = FALSE, 
     method.args = list(family = "poisson"), linetype = "dashed")+ 
    geom_line(data=pframe) ## use prediction data here 
      ## (inherits aesthetics etc. from main ggplot call) 

(यहां एकमात्र अंतर यह है कि जिस तरह से मैंने इसे किया है, भविष्यवाणियां सभी समूहों के लिए पूर्ण क्षैतिज सीमा तक फैली हुई हैं, जैसे कि आपने geom_smooth() में निर्दिष्ट किया था)।

सिद्धांत रूप में ऐसा लगता है कि sjPlot package इस तरह की चीज़ को संभालने में सक्षम होना चाहिए, लेकिन ऐसा लगता है कि इस प्लॉट प्रकार को करने के लिए कोड का प्रासंगिक बिट एक द्विपक्षीय जीएलएम मानने के लिए कठिन कोड है ... ओह ठीक है ।

0

मुझे यकीन नहीं है, लेकिन आपने "बातचीत के बिना" लिखा - शायद आप प्रभाव भूखंडों की तलाश में हैं? (यदि नहीं, मुझे क्षमा करें कि मैं कुछ पूरी तरह से गलत मान रहा हूं ...)

उदाहरण के लिए, आप effects package का उपयोग कर सकते हैं।

dta <- read.csv("http://www.ats.ucla.edu/stat/data/poisson_sim.csv") 
dta <- within(dta, { 
    prog <- factor(prog, levels=1:3, labels=c("General", "Academic", "Vocational")) 
    id <- factor(id) 
}) 

mod <- glm(num_awards ~ math + prog, data = dta, family = "poisson") 

library(effects) 
plot(allEffects(mod)) 

enter image description here

एक अन्य विकल्प sjPlot पैकेज होगा, के रूप में बेन सुझाव दिया - हालांकि, क्रैन पर मौजूदा संस्करण केवल रसद प्रतिगमन मॉडल ठीक से प्रभाव भूखंडों के लिए समर्थन करता है। लेकिन GitHub पर वर्तमान विकास संस्करण में मैंने विभिन्न मॉडल परिवारों और लिंक फ़ंक्शंस के लिए समर्थन जोड़ा, इसलिए यदि आप चाहें, तो आप उस स्नैपशॉट को डाउनलोड कर सकते हैं।sjPlot पैकेज बजाय ggplot का उपयोग करता जाली के (जो प्रभाव पैकेज द्वारा किया जाता है, मुझे लगता है):

sjp.glm(mod, type = "eff", show.ci = T) 

enter image description here

या गैर-आयामी तरह से:

sjp.glm(mod, type = "eff", facet.grid = F, show.ci = T) 

enter image description here

enter image description here

+0

धन्यवाद, लेकिन मैं यह काफी क्या ओ पी चाहता है करता नहीं लगता। "बातचीत के बिना" का अर्थ है कि वे एक योजक ('~ गणित + प्रोग ') मॉडल की भविष्यवाणियों को साजिश करना चाहते हैं ... –

+0

ठीक है, आपके उत्तर की तुलना में साजिश पाने के लिए सबसे कम तरीका दिखता है। "इंटरैक्शन के बिना" और 'num_awards = ß0 + ß1 * गणित + ß2 * प्रोग + त्रुटि' मुझे लगता है कि ओपी की तलाश में मामूली प्रभाव था। – Daniel

+0

... मैंने 'sjp.glm (mod, type =" y.pc ", axisLabels =" math ") की कोशिश की, जो मुझे लगता है कि ओपी चाहता है, एसजेप्लॉट संस्करण 1.9.4.2 (गीथूब से ताजा, जब तक मैं खराब हो गया) और एक खाली साजिश और एक चेतावनी संदेश मिला ... –

3

विशिष्ट मॉडल शर्तों के जवाब के अनुमानित मूल्य की साजिश रचने के बेन के विचार ने मुझे sjp.glm फ़ंक्शन के type = "y.pc" विकल्प में सुधार करने के लिए प्रेरित किया। संस्करण संख्या 1.9.4-3 के साथ एक नया अपडेट on GitHub है।

विशिष्ट शब्दों की

अब आप भविष्यवाणी प्लॉट कर सकते हैं मूल्यों, जिनमें x- अक्ष प्रयोग किया जाता है, और एक दूसरे समूहीकरण कारक के रूप में प्रयोग किया जाता है एक:

sjp.glm(mod, type = "y.pc", vars = c("math", "prog")) 

जो आप निम्नलिखित साजिश देता है:

enter image description here

vars आपके मॉडल में दो से अधिक शर्तों के मामले में तर्क की आवश्यकता है, एक्स-अक्ष-रेंज के लिए शब्द और समूह के लिए शब्द निर्दिष्ट करने के लिए।

तुम भी समूहों पहलू कर सकते हैं:

sjp.glm(mod, type = "y.pc", vars = c("math", "prog"), show.ci = T, facet.grid = T) 

enter image description here

संबंधित मुद्दे