এই থ্রেডের অন্য কোথাও আমি পয়েন্টগুলি সাবমল করার একটি সহজ তবে কিছুটা অ্যাডহক সমাধান প্রস্তাব করেছি । এটি দ্রুত, তবে দুর্দান্ত প্লট তৈরি করতে কিছু পরীক্ষা-নিরীক্ষার প্রয়োজন। বর্ণিত হওয়া সমাধানটি হ'ল প্রস্থের ধীর ক্রম (1.2 মিলিয়ন পয়েন্টের জন্য 10 সেকেন্ড পর্যন্ত সময় নেওয়া) তবে অভিযোজিত এবং স্বয়ংক্রিয়। বড় ডেটাসেটের জন্য, প্রথম বার ভাল ফলাফল দেওয়া উচিত এবং যুক্তিযুক্তভাবে দ্রুত করা উচিত।
ডিএন
এর এক্সট্রামায় যোগ দেওয়ার লাইনের মধ্যে সর্বাধিক উল্লম্ব বিচ্যুতি সন্ধান করুন( x , y))টিY
যত্ন নেওয়ার জন্য কিছু বিশদ রয়েছে, বিশেষত বিভিন্ন দৈর্ঘ্যের ডেটাসেটগুলি মোকাবেলা করার জন্য। আমি লম্বাটির সাথে সম্পর্কিত কোয়ান্টাইলগুলির দ্বারা সংক্ষিপ্ত একটিকে প্রতিস্থাপন করে এটি করি: কার্যত, সংক্ষিপ্তটির EDF এর একটি টুকরোচক রৈখিক আনুমানিকতা এর প্রকৃত ডেটা মানগুলির পরিবর্তে ব্যবহৃত হয়। ("সংক্ষিপ্ত" এবং "দীর্ঘ" সেট করে বিপরীত হতে পারে use.shortest=TRUE
))
এখানে একটি R
বাস্তবায়ন।
qq <- function(x0, y0, t.y=0.0005, use.shortest=FALSE) {
qq.int <- function(x,y, i.min,i.max) {
# x, y are sorted and of equal length
n <-length(y)
if (n==1) return(c(x=x, y=y, i=i.max))
if (n==2) return(cbind(x=x, y=y, i=c(i.min,i.max)))
beta <- ifelse( x[1]==x[n], 0, (y[n] - y[1]) / (x[n] - x[1]))
alpha <- y[1] - beta*x[1]
fit <- alpha + x * beta
i <- median(c(2, n-1, which.max(abs(y-fit))))
if (abs(y[i]-fit[i]) > thresh) {
assemble(qq.int(x[1:i], y[1:i], i.min, i.min+i-1),
qq.int(x[i:n], y[i:n], i.min+i-1, i.max))
} else {
cbind(x=c(x[1],x[n]), y=c(y[1], y[n]), i=c(i.min, i.max))
}
}
assemble <- function(xy1, xy2) {
rbind(xy1, xy2[-1,])
}
#
# Pre-process the input so that sorting is done once
# and the most detail is extracted from the data.
#
is.reversed <- length(y0) < length(x0)
if (use.shortest) is.reversed <- !is.reversed
if (is.reversed) {
y <- sort(x0)
n <- length(y)
x <- quantile(y0, prob=(1:n-1)/(n-1))
} else {
y <- sort(y0)
n <- length(y)
x <- quantile(x0, prob=(1:n-1)/(n-1))
}
#
# Convert the relative threshold t.y into an absolute.
#
thresh <- t.y * diff(range(y))
#
# Recursively obtain points on the QQ plot.
#
xy <- qq.int(x, y, 1, n)
if (is.reversed) cbind(x=xy[,2], y=xy[,1], i=xy[,3]) else xy
}
উদাহরণ হিসাবে আমি আমার পূর্ববর্তী উত্তরের মতো সিমুলেটেড ডেটা ব্যবহার করি (একটি চরম উচ্চ আউটলেট ফেলে দেওয়া y
এবং x
এই সময়ে বেশ কিছুটা দূষণের সাথে ):
set.seed(17)
n.x <- 1.21 * 10^6
n.y <- 1.20 * 10^6
k <- floor(0.01*n.x)
x <- c(rnorm(n.x-k), rnorm(k, mean=2, sd=2))
x <- x[x <= -3 | x >= -2.5]
y <- c(rbeta(n.y, 10,13), 1)
প্রান্তিকের ছোট এবং ছোট মানগুলি ব্যবহার করে কয়েকটি সংস্করণ প্লট করা যাক। .0005 এর মান এবং একটি মনিটরে 1000 পিক্সেল লম্বা প্রদর্শিত, আমরা হব প্লটের যে কোনও জায়গায় অর্ধেক উল্লম্ব পিক্সেলের চেয়ে বেশি না হওয়ার ত্রুটির গ্যারান্টি । এটি ধূসর রঙে দেখানো হয়েছে (কেবল 522 পয়েন্ট, লাইন বিভাগ দ্বারা যুক্ত); মোটা অনুমানগুলি এর উপরে প্লট করা হয়: প্রথমে কালোতে, তারপরে লাল রঙের (লাল পয়েন্টগুলি কালো রঙের একটি উপসেট হবে এবং সেগুলি overplot করা হবে), তারপরে নীল (যা আবার একটি উপসেট এবং ওভারপ্ল্লট)। সময়সীমা 6.5 (নীল) থেকে 10 সেকেন্ড (ধূসর) পর্যন্ত। প্রদত্ত যে তারা এত ভাল স্কেল করেছে, কেউ কেবল মাত্র প্রান্তিকের জন্য সর্বজনীন ডিফল্ট হিসাবে প্রায় দেড় পিক্সেল ব্যবহার করতে পারে ( যেমন , 1000 পিক্সেলের উচ্চ মনিটরের জন্য 1/2000) এবং এটি দিয়ে সম্পন্ন করা হবে।
qq.1 <- qq(x,y)
plot(qq.1, type="l", lwd=1, col="Gray",
xlab="x", ylab="y", main="Adaptive QQ Plot")
points(qq.1, pch=".", cex=6, col="Gray")
points(qq(x,y, .01), pch=23, col="Black")
points(qq(x,y, .03), pch=22, col="Red")
points(qq(x,y, .1), pch=19, col="Blue")
সম্পাদন করা
qq
মূল দুটি অ্যারের দীর্ঘতম (বা সংক্ষিপ্ততম হিসাবে নির্দিষ্ট হিসাবে) সূচকের তৃতীয় কলামটি ফিরিয়ে আনার জন্য আমি মূল কোডটি সংশোধন করেছি x
এবং y
নির্বাচিত পয়েন্টগুলির সাথে মিল রেখে। এই সূচকগুলি ডেটার "আকর্ষণীয়" মানগুলিকে নির্দেশ করে এবং তাই আরও বিশ্লেষণের জন্য কার্যকর হতে পারে।
আমি বারবার মানগুলির সাথে সংঘটিত একটি বাগও সরিয়েছি x
(যার কারণে)beta
)
approx()
ফাংশনটিqqplot()
ফাংশনে কার্যকর হয়।