আর-তে ggplot2 ব্যবহার করে কীভাবে ফানেল প্লট আঁকবেন?


12

শিরোনাম হিসাবে, আমাকে এরকম কিছু আঁকতে হবে:

বিকল্প পাঠ

Ggplot, বা অন্যান্য প্যাকেজগুলি যদি ggplot সক্ষম না হয় তবে এরকম কিছু আঁকতে ব্যবহার করা যেতে পারে?


2
এটি কীভাবে করা এবং এটি বাস্তবায়ন করা যায় সে সম্পর্কে আমার কয়েকটি ধারণা পেয়েছে তবে এতে কিছু ডেটা থাকার জন্য প্রশংসা করব। কোন ধারণা?
চেজ

1
হ্যাঁ, জিপিপ্লট সহজেই একটি প্লট আঁকতে পারে যা পয়েন্ট এবং লাইনগুলি নিয়ে গঠিত;) জিওম_স্মোথ আপনাকে 95% পথ দেবে - আপনি যদি আরও পরামর্শ চান তবে আপনাকে আরও বিশদ সরবরাহ করতে হবে।
হ্যাডলি

2
এটি কোনও ফানেল প্লট নয়। পরিবর্তে, লাইনগুলি স্পষ্টতই প্রবেশের সংখ্যার ভিত্তিতে স্ট্যান্ডার্ড ত্রুটির অনুমান থেকে তৈরি করা হয়। তারা মনে করে ডেটাগুলির একটি নির্দিষ্ট অনুপাতে ঘেরাও করার উদ্দেশ্যে , যা তাদের সহনীয়তার সীমাবদ্ধ করে তুলবে তারা y = বেসলাইন + ধ্রুবক / স্কয়ার্ট (# ভর্তি * চ (বেসলাইন)) ফর্মের সম্ভবত। লাইনগুলি গ্রাফ করার জন্য আপনি বিদ্যমান প্রতিক্রিয়াগুলিতে কোডটি সংশোধন করতে পারেন, তবে তাদের গণনা করার জন্য আপনার নিজের সূত্র সরবরাহের প্রয়োজন হতে পারে: উদাহরণস্বরূপ আমি লাগানো লাইনের জন্য প্লটের আত্মবিশ্বাসের অন্তর দেখেছি । এ কারণেই এগুলিকে অন্যরকম দেখাচ্ছে।
শুক্র

@ হুইবার (+1) এটি একটি খুব ভাল বিষয়, সত্যই। আমি আশা করি এটি যাইহোক একটি ভাল সূচনা পয়েন্ট সরবরাহ করতে পারে (যদিও আমার আর কোডটি সেই অনুকূলিত নাও হয়)।
chl

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% লাইন প্লট করে - বর্তমান জিজিপ্লট 2 (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

এছাড়াও প্যাকেজ এক্সফানেল রয়েছে, যা আমি দেখিনি।


2

বার্ড ওয়েইসের কোডটি খুব সহায়ক। কয়েকটি বৈশিষ্ট্য পরিবর্তন / যুক্ত করতে আমি নীচে কিছু সংশোধন করেছি:

  1. নির্ভুলতার পরিমাপ হিসাবে স্ট্যান্ডার্ড ত্রুটি ব্যবহার করা হয়েছে যা আমি দেখছি ফানাল প্লটগুলির তুলনায় বেশি সাধারণ (মনোবিজ্ঞানে)
  2. অক্ষগুলি অদলবদল করে, তাই যথাযথতা (স্ট্যান্ডার্ড ত্রুটি) y- অক্ষের উপর রয়েছে, এবং প্রভাবের আকারটি X- অক্ষে রয়েছে
  3. মেটা-অ্যানালিটিক্সের গড় রেখার জন্য রেখার geom_segmentপরিবর্তে ব্যবহৃত হয় geom_line, সুতরাং এটি 95% এবং 99% আস্থাভাজন অঞ্চলকে চিহ্নিত করে রেখার সমান উচ্চতা হয়
  4. মেটা-অ্যানালিটিক গড় মানে প্লট করার পরিবর্তে আমি এটি 95% আত্মবিশ্বাসের ব্যবধানের প্লট করেছি

আমার কোডটি উদাহরণ হিসাবে 0.0892 (সে = 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

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.