आर में ggplot2 का उपयोग करके फ़नल प्लाट कैसे बनाएं?


12

शीर्षक के रूप में, मुझे कुछ इस तरह आकर्षित करना होगा:

वैकल्पिक शब्द

क्या ggplot, या अन्य पैकेज अगर ggplot सक्षम नहीं है, का उपयोग कुछ इस तरह से किया जा सकता है?


2
मुझे यह कैसे करना है और इसे कैसे लागू करना है, इसके बारे में कुछ विचार मिले हैं, लेकिन कुछ आंकड़ों के साथ खेलने की सराहना करेंगे। उस पर कोई विचार?
पीछा करें

1
हां, ggplot आसानी से एक भूखंड खींच सकता है जो बिंदु और रेखाओं से बना है;) geom_smooth आपको 95% तरीके से मिलेगा - यदि आप अधिक सलाह चाहते हैं तो आपको अधिक विवरण प्रदान करने की आवश्यकता होगी।
हैडले

2
यह एक फ़नल प्लॉट नहीं है। इसके बजाय, प्रवेश की संख्या के आधार पर मानक त्रुटियों के अनुमान से स्पष्ट रूप से लाइनों का निर्माण किया जाता है। वे डेटा का एक निर्दिष्ट अनुपात संलग्न करना चाहते हैं, जो उन्हें सहिष्णुता की सीमा बना देगा वे फार्म y = बेसलाइन + स्थिरांक / Sqrt (# प्रवेश * f (बेसलाइन)) की संभावना रखते हैं। आप लाइनों को रेखांकन करने के लिए मौजूदा प्रतिक्रियाओं में कोड को संशोधित कर सकते हैं, लेकिन आपको उनकी गणना करने के लिए अपने स्वयं के फार्मूले की आपूर्ति करने की आवश्यकता होगी: उदाहरण मैंने स्वयं फिट लाइन के लिए प्लॉट विश्वास अंतराल देखा है । इसलिए वे इतने अलग दिखते हैं।
whuber

@whuber (+1) यह वास्तव में एक बहुत अच्छा बिंदु है। मुझे उम्मीद है कि यह एक अच्छा प्रारंभिक बिंदु प्रदान कर सकता है (भले ही मेरा आर कोड उस अनुकूलित नहीं है)।
ch:

Ggplot अभी भी stat_quantile()स्कैटरप्लॉट पर सशर्त मात्रात्मक लगाने के लिए प्रदान करता है। फिर आप सूत्र पैरामीटर के साथ मात्रात्मक प्रतिगमन के कार्यात्मक रूप को नियंत्रित कर सकते हैं। मैं फार्मूला जैसी चीजों का सुझाव देता हूं y~ns(x,4)
शिया पार्क्स

जवाबों:


12

हालाँकि इसमें सुधार की गुंजाइश है, यहाँ सिम्युलेटेड (विषमलैंगिक) डेटा के साथ एक छोटा प्रयास है:

library(ggplot2)
set.seed(101)
x <- runif(100, min=1, max=10)
y <- rnorm(length(x), mean=5, sd=0.1*x)
df <- data.frame(x=x*70, y=y)
m <- lm(y ~ x, data=df) 
fit95 <- predict(m, interval="conf", level=.95)
fit99 <- predict(m, interval="conf", level=.999)
df <- cbind.data.frame(df, 
                       lwr95=fit95[,"lwr"],  upr95=fit95[,"upr"],     
                       lwr99=fit99[,"lwr"],  upr99=fit99[,"upr"])

p <- ggplot(df, aes(x, y)) 
p + geom_point() + 
    geom_smooth(method="lm", colour="black", lwd=1.1, se=FALSE) + 
    geom_line(aes(y = upr95), color="black", linetype=2) + 
    geom_line(aes(y = lwr95), color="black", linetype=2) +
    geom_line(aes(y = upr99), color="red", linetype=3) + 
    geom_line(aes(y = lwr99), color="red", linetype=3)  + 
    annotate("text", 100, 6.5, label="95% limit", colour="black", 
             size=3, hjust=0) +
    annotate("text", 100, 6.4, label="99.9% limit", colour="red", 
             size=3, hjust=0) +
    labs(x="No. admissions...", y="Percentage of patients...") +    
    theme_bw() 

वैकल्पिक शब्द


20

यदि आप इस (मेटा-एनालिसिस) प्रकार के फ़नल प्लॉट की तलाश कर रहे हैं , तो निम्नलिखित एक प्रारंभिक बिंदु हो सकता है:

library(ggplot2)

set.seed(1)
p <- runif(100)
number <- sample(1:1000, 100, replace = TRUE)
p.se <- sqrt((p*(1-p)) / (number))
df <- data.frame(p, number, p.se)

## common effect (fixed effect model)
p.fem <- weighted.mean(p, 1/p.se^2)

## lower and upper limits for 95% and 99.9% CI, based on FEM estimator
number.seq <- seq(0.001, max(number), 0.1)
number.ll95 <- p.fem - 1.96 * sqrt((p.fem*(1-p.fem)) / (number.seq)) 
number.ul95 <- p.fem + 1.96 * sqrt((p.fem*(1-p.fem)) / (number.seq)) 
number.ll999 <- p.fem - 3.29 * sqrt((p.fem*(1-p.fem)) / (number.seq)) 
number.ul999 <- p.fem + 3.29 * sqrt((p.fem*(1-p.fem)) / (number.seq)) 
dfCI <- data.frame(number.ll95, number.ul95, number.ll999, number.ul999, number.seq, p.fem)

## draw plot
fp <- ggplot(aes(x = number, y = p), data = df) +
    geom_point(shape = 1) +
    geom_line(aes(x = number.seq, y = number.ll95), data = dfCI) +
    geom_line(aes(x = number.seq, y = number.ul95), data = dfCI) +
    geom_line(aes(x = number.seq, y = number.ll999), linetype = "dashed", data = dfCI) +
    geom_line(aes(x = number.seq, y = number.ul999), linetype = "dashed", data = dfCI) +
    geom_hline(aes(yintercept = p.fem), data = dfCI) +
    scale_y_continuous(limits = c(0,1.1)) +
  xlab("number") + ylab("p") + theme_bw() 
fp

वैकल्पिक शब्द


1
ब्रैकेट के linetype=2अंदर तर्क की उपस्थिति aes()- 99% लाइनों की साजिश रचने - एक त्रुटि को जन्म देती है "वर्तमान चर को linetype में मैप नहीं किया जा सकता" वर्तमान ggplot2 (0.9.3.1) के साथ। मेरे geom_line(aes(x = number.seq, y = number.ll999, linetype = 2), data = dfCI)लिए geom_line(aes(x = number.seq, y = number.ll999), linetype = 2, data = dfCI)काम करने के लिए संशोधन । मूल उत्तर को संशोधित करने और इसे खोने के लिए स्वतंत्र महसूस करें।

2

क्रैन पैकेज बेरीफिकेशन भी देखें, जिसमें ggplot2 का उपयोग किए बिना आनुपातिक के लिए एक फ़नलप्लॉट है, अगर किसी को आधार ग्राफिक्स में इसकी आवश्यकता है। http://cran.r-project.org/web/packages/berryFunctions/index.html

वहाँ भी पैकेज extfunnel है, जो मैंने नहीं देखा है।


2

Bernd Weiss का कोड बहुत मददगार है। मैंने कुछ सुविधाएँ बदलने / जोड़ने के लिए नीचे कुछ संशोधन किए हैं:

  1. सटीक की माप के रूप में मानक त्रुटि का उपयोग किया जाता है, जो फ़नल प्लॉट्स को मैं (मनोविज्ञान में) देखता हूं।
  2. कुल्हाड़ियों को स्वैप किया, इसलिए y- अक्ष पर सटीक (मानक त्रुटि) है, और x- अक्ष पर प्रभाव का आकार है
  3. मेटा-एनालिटिक माध्य का सीमांकन करने वाली रेखा के geom_segmentबजाय उपयोग किया जाता geom_lineहै, ताकि यह 95% और 99% विश्वास क्षेत्रों का सीमांकन करने वाली रेखाओं के समान ऊँचाई हो
  4. मेटा-एनालिटिकल माध्य की साजिश रचने के बजाय, मैंने इसे 95% विश्वास अंतराल करार दिया

मेरा कोड एक उदाहरण के रूप में मेटा-एनालिटिक माध्य 0.0892 (se = 0.0035) का उपयोग करता है, लेकिन आप अपने स्वयं के मूल्यों को स्थानापन्न कर सकते हैं।

estimate = 0.0892
se = 0.0035

#Store a vector of values that spans the range from 0
#to the max value of impression (standard error) in your dataset.
#Make the increment (the final value) small enough (I choose 0.001)
#to ensure your whole range of data is captured
se.seq=seq(0, max(dat$corr_zi_se), 0.001)

#Compute vectors of the lower-limit and upper limit values for
#the 95% CI region
ll95 = estimate-(1.96*se.seq)
ul95 = estimate+(1.96*se.seq)

#Do this for a 99% CI region too
ll99 = estimate-(3.29*se.seq)
ul99 = estimate+(3.29*se.seq)

#And finally, calculate the confidence interval for your meta-analytic estimate 
meanll95 = estimate-(1.96*se)
meanul95 = estimate+(1.96*se)

#Put all calculated values into one data frame
#You might get a warning about '...row names were found from a short variable...' 
#You can ignore it.
dfCI = data.frame(ll95, ul95, ll99, ul99, se.seq, estimate, meanll95, meanul95)


#Draw Plot
fp = ggplot(aes(x = se, y = Zr), data = dat) +
  geom_point(shape = 1) +
  xlab('Standard Error') + ylab('Zr')+
  geom_line(aes(x = se.seq, y = ll95), linetype = 'dotted', data = dfCI) +
  geom_line(aes(x = se.seq, y = ul95), linetype = 'dotted', data = dfCI) +
  geom_line(aes(x = se.seq, y = ll99), linetype = 'dashed', data = dfCI) +
  geom_line(aes(x = se.seq, y = ul99), linetype = 'dashed', data = dfCI) +
  geom_segment(aes(x = min(se.seq), y = meanll95, xend = max(se.seq), yend = meanll95), linetype='dotted', data=dfCI) +
  geom_segment(aes(x = min(se.seq), y = meanul95, xend = max(se.seq), yend = meanul95), linetype='dotted', data=dfCI) +
  scale_x_reverse()+
  scale_y_continuous(breaks=seq(-1.25,2,0.25))+
  coord_flip()+
  theme_bw()
fp

यहां छवि विवरण दर्ज करें

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