"ভৌগোলিকভাবে ওজনযুক্ত পিসিএ" অত্যন্ত বর্ণনামূলক: R
প্রোগ্রামটি কার্যত নিজের লেখায়। (এটির কোডের আসল লাইনের চেয়ে কমেন্ট লাইন দরকার))
ওজন দিয়ে শুরু করা যাক, কারণ এটি এখানে পিসিএ থেকে ভৌগলিকভাবে ভারিত পিসিএ যন্ত্রাংশ সংস্থা। "ভৌগলিক" শব্দটির অর্থ ওজন একটি বেস পয়েন্ট এবং ডেটা অবস্থানের মধ্যে দূরত্বগুলির উপর নির্ভর করে। মান - তবে কোনওভাবেই নয় - ওজন একটি গাউসীয় কার্য; এটি হল স্কোয়ার দূরত্ব সহ সূচকীয় ক্ষয়। ব্যবহারকারীর ক্ষয় হার নির্দিষ্ট করতে হবে - বা আরও স্বজ্ঞাতভাবে - একটি বৈশিষ্ট্যযুক্ত দূরত্ব যার উপর একটি নির্দিষ্ট পরিমাণ ক্ষয় ঘটে occurs
distance.weight <- function(x, xy, tau) {
# x is a vector location
# xy is an array of locations, one per row
# tau is the bandwidth
# Returns a vector of weights
apply(xy, 1, function(z) exp(-(z-x) %*% (z-x) / (2 * tau^2)))
}
পিসিএ কোনও প্রবক্তা বা পারস্পরিক সম্পর্ক মেট্রিক্সের (যা কোভারিয়েন্স থেকে প্রাপ্ত) প্রযোজ্য। এখানে, তবে, সংখ্যার সাথে স্থিতিশীল উপায়ে ওজনযুক্ত সমবায়াগুলি গণনা করার একটি ফাংশন।
covariance <- function(y, weights) {
# y is an m by n matrix
# weights is length m
# Returns the weighted covariance matrix of y (by columns).
if (missing(weights)) return (cov(y))
w <- zapsmall(weights / sum(weights)) # Standardize the weights
y.bar <- apply(y * w, 2, sum) # Compute column means
z <- t(y) - y.bar # Remove the means
z %*% (w * t(z))
}
প্রতিটি ভেরিয়েবলের পরিমাপের ইউনিটের জন্য স্ট্যান্ডার্ড বিচ্যুতিগুলি ব্যবহার করে পারস্পরিক সম্পর্কটি স্বাভাবিক উপায়ে উত্পন্ন হয়:
correlation <- function(y, weights) {
z <- covariance(y, weights)
sigma <- sqrt(diag(z)) # Standard deviations
z / (sigma %o% sigma)
}
এখন আমরা পিসিএ করতে পারি:
gw.pca <- function(x, xy, y, tau) {
# x is a vector denoting a location
# xy is a set of locations as row vectors
# y is an array of attributes, also as rows
# tau is a bandwidth
# Returns a `princomp` object for the geographically weighted PCA
# ..of y relative to the point x.
w <- distance.weight(x, xy, tau)
princomp(covmat=correlation(y, w))
}
(এটি এখন পর্যন্ত এক্সিকিউটেবল কোডের নেট 10 লাইন the
আসুন প্রশ্নে বর্ণিতগুলির সাথে তুলনীয় কিছু এলোমেলো নমুনার ডেটা দিয়ে চিত্রিত করুন: 550 স্থানে 30 ভেরিয়েবল।
set.seed(17)
n.data <- 550
n.vars <- 30
xy <- matrix(rnorm(n.data * 2), ncol=2)
y <- matrix(rnorm(n.data * n.vars), ncol=n.vars)
ভৌগোলিকভাবে ওজনযুক্ত গণনাগুলি প্রায়শই কোনও নির্বাচিত লোকেশনগুলির সেটগুলিতে যেমন ট্রান্সেক্ট বা একটি নিয়মিত গ্রিডের পয়েন্টে সঞ্চালিত হয়। আসুন ফলাফলগুলি সম্পর্কে কিছু দৃষ্টিকোণ পেতে একটি মোটা গ্রিড ব্যবহার করুন; পরে - একবার আমাদের আত্মবিশ্বাস হয়ে যায় যে সবকিছু কাজ করছে এবং আমরা যা চাই তা পাচ্ছি - আমরা গ্রিডটি পরিমার্জন করতে পারি।
# Create a grid for the GWPCA, sweeping in rows
# from top to bottom.
xmin <- min(xy[,1]); xmax <- max(xy[,1]); n.cols <- 30
ymin <- min(xy[,2]); ymax <- max(xy[,2]); n.rows <- 20
dx <- seq(from=xmin, to=xmax, length.out=n.cols)
dy <- seq(from=ymin, to=ymax, length.out=n.rows)
points <- cbind(rep(dx, length(dy)),
as.vector(sapply(rev(dy), function(u) rep(u, length(dx)))))
প্রতিটি পিসিএ থেকে আমরা কী তথ্য ধরে রাখতে চাই তা নিয়ে একটি প্রশ্ন রয়েছে। সাধারণত, এন ভেরিয়েবলের জন্য একটি পিসিএ এন ইজেনভ্যালুগুলির একটি সাজানো তালিকা প্রদান করে এবং - বিভিন্ন আকারে - এন ভেক্টরগুলির একটি তালিকা , প্রতিটি দৈর্ঘ্য এন । মানচিত্রে এটি এন * (এন + 1) নম্বর! প্রশ্ন থেকে কিছু ইঙ্গিত নেওয়া যাক, আসল মানচিত্রগুলি ম্যাপ করুন। এগুলি অ্যাট্রিবিউটের gw.pca
মাধ্যমে আউটপুট থেকে বের করা হয় $sdev
, যা উত্পন্ন মান দ্বারা ইগেনভ্যালুগুলির তালিকা।
# Illustrate GWPCA by obtaining all eigenvalues at each grid point.
system.time(z <- apply(points, 1, function(x) gw.pca(x, xy, y, 1)$sdev))
এটি এই মেশিনে 5 সেকেন্ডেরও কম সময়ে সম্পূর্ণ হয়। লক্ষ করুন যে 1 এর একটি বৈশিষ্ট্যযুক্ত দূরত্ব (বা "ব্যান্ডউইথ") কলটিতে ব্যবহৃত হয়েছিল gw.pca
।
বাকীটি আপকে তোলার বিষয়। raster
লাইব্রেরি ব্যবহার করে ফলাফলগুলি ম্যাপ করুন (পরিবর্তে, কোনও জিআইএসের সাথে পোস্ট-প্রসেসিংয়ের জন্য গ্রিড ফর্ম্যাটে ফলাফল লিখতে পারে))
library("raster")
to.raster <- function(u) raster(matrix(u, nrow=n.cols),
xmn=xmin, xmx=xmax, ymn=ymin, ymx=ymax)
maps <- apply(z, 1, to.raster)
par(mfrow=c(2,2))
tmp <- lapply(maps, function(m) {plot(m); points(xy, pch=19)})
এগুলি 30 টি মানচিত্রের মধ্যে প্রথম চারটি যা চারটি বৃহত্তম ইগন্যালুগুলি দেখায়। (তাদের আয়তন, যা প্রতি অবস্থানে 1 অতিক্রম দ্বারা উত্তেজিত না পেতে রিকল যে। এই তথ্য সম্পূর্ণভাবে এলোমেলোভাবে উত্পন্ন হয় এবং সেইজন্য, যদি তারা একেবারেই কোনও পারস্পরিক সম্পর্ক গঠন আছে - যা এই মানচিত্রে largish eigenvalues ইঙ্গিত বলে মনে হচ্ছে - এটি কেবলমাত্র সুযোগের কারণে এবং ডেটা উত্পন্ন প্রক্রিয়াটি ব্যাখ্যা করে এমন কিছু "বাস্তব" প্রতিফলিত করে না))
এটি ব্যান্ডউইথ পরিবর্তন করার জন্য শিক্ষণীয়। যদি এটি খুব ছোট হয় তবে সফ্টওয়্যারটি এককতার বিষয়ে অভিযোগ করবে। (আমি এই নগ্ন-হাড় প্রয়োগে কোনও ত্রুটি তৈরি করিনি)) তবে এটি 1 থেকে 1/4 কমানো (এবং আগের মতো একই ডেটা ব্যবহার করা) আকর্ষণীয় ফলাফল দেয়:
সীমানার চারপাশের পয়েন্টগুলির জন্য অস্বাভাবিকভাবে বড় অধ্যুষিত ইগেনালুগুলি দেওয়ার জন্য প্রবণতাটি লক্ষ্য করুন (উপরের বাম হাতের মানচিত্রের সবুজ অবস্থানগুলিতে দেখানো হয়েছে), অন্য সমস্ত ইগেনভ্যালু ক্ষতিপূরণ দিতে হতাশাগ্রস্থ হয়েছেন (অন্য তিনটি মানচিত্রে হালকা গোলাপী দেখানো হয়েছে) । এই ঘটনাটি, এবং পিসিএ এবং ভৌগলিক ওজন সম্পর্কিত অনেক সূক্ষ্মতাগুলি, পিসিএর ভৌগলিকভাবে ভারিত সংস্করণটির ব্যাখ্যা করার জন্য নির্ভরযোগ্যভাবে আশা করার আগে বুঝতে হবে। এবং তারপরে অন্য 30 * 30 = 900 ইগেনভেেক্টর (বা "লোডিং") বিবেচনা করার জন্য রয়েছে ...