আমি আর রোলপ্লে পিসিএতে "ঝাঁপিয়ে পড়া" লোডিংগুলি পাচ্ছি? আমি কি এটি ঠিক করতে পারি?


20

আমার কাছে 28 টি বিভিন্ন মুদ্রার জন্য 10 বছরের দৈনিক রিটার্নের ডেটা রয়েছে। আমি প্রথম প্রধান উপাদানটি বের করতে চাই, তবে পুরো 10 বছরে পিসিএ পরিচালনা করার পরিবর্তে, আমি 2 বছরের উইন্ডো রোলপ্লে করতে চাই, কারণ মুদ্রার আচরণগুলি বিকশিত হয় এবং তাই আমি এটি প্রতিফলিত করতে চাই। তবে আমার একটি বড় সমস্যা রয়েছে, এটি হ'ল প্রিনম্পম্প () এবং প্রম্পম্প () উভয় ফাংশনই প্রায়শই সংলগ্ন পিসিএ বিশ্লেষণে (অর্থাত্ 1 দিন বাদে) নেতিবাচক লোডিংয়ের দিকে ঝাপিয়ে যায়। EUR মুদ্রার জন্য লোডিং চার্টটি একবার দেখুন:

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

স্পষ্টতই আমি এটি ব্যবহার করতে পারছি না কারণ সংলগ্ন লোডিংগুলি ইতিবাচক থেকে নেতিবাচক দিকে চলে যাবে, সুতরাং আমার সিরিজ যা সেগুলি ব্যবহার করে তা ভুল হবে। এখন EUR মুদ্রা লোডিংয়ের পরম মানটি দেখুন:

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

সমস্যা অবশ্যই আমি এখনও এটি ব্যবহার করতে পারি না কারণ আপনি শীর্ষের চার্ট থেকে দেখতে পারেন যে লোডটি নেতিবাচক থেকে ইতিবাচক এবং মাঝে মাঝে ফিরে আসে, এটি একটি বৈশিষ্ট্য যা আমার সংরক্ষণ করা দরকার।

আমি এই সমস্যাটি পেতে পারি এমন কোনও উপায় আছে কি? পার্শ্ববর্তী পিসিএগুলিতে আমি কি ইগেনভেક્ટર ওরিয়েন্টেশনটি সর্বদা একই হতে বাধ্য করতে পারি?

উপায় দ্বারা এই সমস্যাটি FactoMineR PCA () ফাংশন দিয়েও ঘটে। রোলপ্লাইয়ের কোডটি এখানে:

rollapply(retmat, windowl, function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right") -> princomproll

3
ইগেনভেেক্টর "ওরিয়েন্টেশন" বলতে আপনি কী বোঝাতে চেয়েছেন? আমি যতদূর জানি, এমন কোনও জিনিস নেই যা উপাত্তের সাথে অন্তর্নিহিত। (এটি বিভিন্ন কারণের কারণেই বিভিন্ন সফ্টওয়্যার বিভিন্ন স্বীকৃত ইগেনভেেক্টর তৈরি করে)) সুতরাং মনে হচ্ছে আপনি এমন কিছু চাইছেন যা অস্তিত্বহীন এবং অর্থহীন।
হোয়াট

1
ভাল একদিন আমি এই জাতীয় লোডগুলি পাব: EUR -0.2 জেআর +0.8 ডলার +0.41 ..... 28 মুদ্রা। এবং পরের দিন আমি EUR +0.21 জেআর -0.79 ডলার -0.4 ইত্যাদি পেয়ে যাব। সুতরাং পিসিএ যে অক্ষকে ডেটাটি ঘোরানোর জন্য বেছে নিয়েছে তা দ্বিতীয় দিনের তুলনায় দ্বিতীয় দিন ঠিক বিপরীত দিকেই অভিমুখী হবে যা কারণ সৃষ্টি করছে এই লোডিং লাফ দেয় এবং আমি এড়াতে চাই, কোনওভাবে ...... যদি আমার পরিভাষাটি বিভ্রান্তিকর হয় তবে দুঃখিত ologies আমি বুঝতে পেরেছি যে পিসিএ কোড অক্ষরেখা সম্পর্কে সত্যই ততক্ষণ চিন্তা করে না যতক্ষণ না এটি একদিনের লোডিংয়ের সাথে সঙ্গতিপূর্ণ হয় তবে আমার এটি একাধিক দিন ধরে সামঞ্জস্যপূর্ণ হওয়া দরকার।
টমাস ব্রাউন

1
মনে রাখবেন যে একদিন থেকে পরের দিন পর্যন্ত, প্রতিদিনের ডেটাগুলিতে 2 বছরের উইন্ডো ঘূর্ণিত দেওয়া আমাদের খুব, একই রকম পিসিএ হওয়া উচিত।
টমাস ব্রাউন

আমি মনে করি যে আপনার সমস্যার কারণ হ'ল এই রোলাপ্লি ধারণাটি বোঝায় না। আপনার লক্ষ্যগুলি অর্জন করতে পারে (সেগুলি কী তা নিশ্চিত নয়) এবং বুদ্ধিমান different
মাইকেল আর চেরনিক

EUR -0.2 ZAR +0.8 USD +0.41এবং EUR +0.21 ZAR -0.79 USD -0.4 হয় খুব খুব অনুরূপ। আপনি কেবল দুটি ফলাফলের যে কোনওতে সাইন ইনভার্ট করুন।
ttnphns

উত্তর:


22

যখনই প্লটটি খুব বেশি লাফ দেয় তখন ওরিয়েন্টেশনটি বিপরীত করুন। একটি কার্যকর মানদণ্ড হ'ল: সমস্ত উপাদানগুলিতে মোট জাম্পের পরিমাণ গণনা করুন। পরের আইজেনভেেক্টরটিকে উপেক্ষা করা হলে মোট জাম্পের পরিমাণ গণনা করুন। যদি পরবর্তীটি কম হয় তবে পরবর্তী ইগেনভেেক্টরটিকে উপেক্ষা করুন।

এখানে একটি বাস্তবায়ন। (আমি এর সাথে পরিচিত নই zoo, যা সম্ভবত আরও মার্জিত সমাধানের অনুমতি দিতে পারে))

require(zoo)
amend <- function(result) {
  result.m <- as.matrix(result)
  n <- dim(result.m)[1]
  delta <- apply(abs(result.m[-1,] - result.m[-n,]), 1, sum)
  delta.1 <- apply(abs(result.m[-1,] + result.m[-n,]), 1, sum)
  signs <- c(1, cumprod(rep(-1, n-1) ^ (delta.1 <= delta)))
  zoo(result * signs)
}

উদাহরণস্বরূপ, আসুন একটি অরথোগোনাল গ্রুপে এলোমেলো পদচারনা চালানো যাক এবং আগ্রহের জন্য এটি কিছুটা ঝাঁকুনি দিন:

random.rotation <- function(eps) {
  theta <- rnorm(3, sd=eps)
  matrix(c(1, theta[1:2], -theta[1], 1, theta[3], -theta[2:3], 1), 3)
}
set.seed(17)
n.times <- 1000
x <- matrix(1., nrow=n.times, ncol=3)
for (i in 2:n.times) {
  x[i,] <- random.rotation(.05) %*% x[i-1,]
}

এখানে রোলিং পিসিএ:

window <- 31
data <- zoo(x)
result <- rollapply(data, window, 
  function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right")
plot(result)

মূল

এখন স্থির সংস্করণ:

plot(amend(result))

সংশোধিত


টিআমিবনামআমি+ +1আমি+ +1বনামআমিআমি1-1 , এর দিকটি ফ্লিপ করুনবনামআমি+ +1
অ্যামিবা জানালেন

@ অ্যামিবা যদিও আপনি ঠিক কী করছেন আমি পুরোপুরি নিশ্চিত নই, তবে ডেভিড জে হ্যারিসের উত্তর এবং এটি অনুসরণ করা মন্তব্যে আলোচিত কিছু ধারণার মতো মনে হচ্ছে। দেখুন, বিশেষতঃ আমার মন্তব্যগুলি stats.stackexchange.com /Qtions/34396/… এ
whuber

2
@ আর্ট, যাতে আমি এটি বুঝতে পারি, আপনি কিছু বাহ্যিক (পিসিএ থেকে বাহ্যিক) পছন্দগুলির উপর ভিত্তি করে উপাদানটির সাইনটি ঠিক করতে চান। এটি ঠিক আছে, তবে আপনার এটির কাছে আসা উচিত। লক্ষণগুলি সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করে প্রথমে স্লাইডিং পিসিএ জিনিসটি করুন। এবং তারপরে কিছু অতিরিক্ত মানদণ্ডের ভিত্তিতে সিদ্ধান্ত নিন, পুরো উপাদানটি ফ্লিপ করবেন কিনা to উদাহরণস্বরূপ আপনি এটি ইউরো প্রবণতার সাথে সম্পর্কিত করতে পারেন এবং যদি সম্পর্কটি নেতিবাচক হয় তবে উপাদানটি ফ্লিপ করুন। বা এমন কিছু। এটি সম্পূর্ণরূপে আপনার নির্দিষ্ট অ্যাপ্লিকেশন এবং আপনার ডোমেন জ্ঞানের উপর নির্ভর করে।
অ্যামিবা বলছেন মনিকা

1
আমি @ অ্যামিবার ব্যাখ্যা এবং সুপারিশের সাথে একমত
হোবার

1
@ অ্যামিবা: হ্যাঁ, আপনি এ সম্পর্কে ঠিকই বলেছেন, যদিও আমি নির্মোহভাবে ভেবেছিলাম যে এমন কিছু জেনেরিক সমাধান হতে পারে যা নির্দিষ্ট সময় সিরিজের উপর নির্ভরশীল না, "ভেক্টরের আসল দিকনির্দেশ" এর মতো কিছু :) যাইহোক, আপনাকে ধন্যবাদ এবং ধন্যবাদ পরামর্শ
বেনামে

8

@ হুবহু ঠিক বলেছেন যে তথ্যের সাথে অন্তর্নিহিত কোনও অভিমুখ নেই, তবে আপনি এখনও প্রয়োগ করতে পারেন যে আপনার ইগেনভেেক্টরগুলির কিছু রেফারেন্স ভেক্টরের সাথে ইতিবাচক সম্পর্ক রয়েছে।

উদাহরণস্বরূপ, আপনি আপনার সমস্ত ইগেনভেেক্টরগুলিতে ডলারে লোডিংকে ইতিবাচক করে তুলতে পারেন (উদাহরণস্বরূপ, যদি ইউএসডি এর লোডিং নেতিবাচক হয় তবে পুরো ভেক্টরের চিহ্নগুলি ফ্লিপ করুন)। আপনার ভেক্টরের সামগ্রিক দিকটি এখনও স্বেচ্ছাসেবী (যেহেতু আপনি এর পরিবর্তে EUR বা ZAR ব্যবহার করতে পারতেন) তবে আপনার পিসিএর প্রথম কয়েকটি অক্ষ সম্ভবত প্রায় ততটা লাফিয়ে উঠবে না - বিশেষত কারণ আপনার ঘূর্ণায়মান উইন্ডোজগুলি তাই দীর্ঘ।


7
ভাল ধারণা. আমি প্রথমে এটি চেষ্টা করেছিলাম (সম্ভবত আপনি এই উত্তরটি পোস্ট করার সময় :-))। সমস্যাটি হ'ল অন্য লোডগুলি প্রায় লাফিয়ে উঠতে পারে। এটি ঠিক করতে, সবচেয়ে বড় লোডিংয়ের উপর সাইন পছন্দটি বেস করুন। এখনও কোনও পাশা নেই: লোডিংগুলি এখনও লাফিয়ে উঠতে পারে। কৌশলটি প্রতিটি সময় ওরিয়েন্টেশন চয়ন করার জন্য যা পূর্ববর্তী সময় থেকে লোডিংয়ের ভেক্টরে ন্যূনতম ব্যাঘাত সৃষ্টি করে ।
whuber

4
@ শুভ সুন্দর কাজ।
ডেভিড জে হ্যারিস

1
সঠিক, লোডিংয়ের সাইনটি কোনও বিষয় নয় (ওরিয়েন্টেশন)। যে বিষয়টি সম্বোধন করা হয়নি তা হ'ল আপনি যদি এটি বিভিন্ন সফ্টওয়্যার প্যাকেজগুলিতে সঞ্চালন করেন তবে প্যাকেজটির মধ্যে পার্থক্য হ'ল একটি প্রোগ্রামের ফলে নির্দিষ্ট লোডিংগুলিতে নেতিবাচক (ধনাত্মক) চিহ্ন হতে পারে এবং অন্যটি একই লোডিংয়ের জন্য ইতিবাচক (নেতিবাচক) লক্ষণ তৈরি করতে পারে। অতএব, অন্য প্যাকেজ ব্যবহার করার সময় উপরের 3-সিরিজের প্লটের চূড়ান্ত ফলাফলের চিহ্নগুলি উল্টানো যেতে পারে। রেফারেন্স ভেক্টর লোডিংয়েও সাইন পরিবর্তন হতে পারে - এবং এই সমাধানটি ভুল হবে না।
JoleT

@ এলইপি: আমি বিপরীতে একই সমস্যার মুখোমুখি হয়েছি, সম্ভবত আপনি এই সমস্যার সমাধান ইতিমধ্যে খুঁজে পেয়েছেন - প্রথম ভেক্টরটি সঠিক কিনা তা কীভাবে খুঁজে বের করবেন এবং নিশ্চিত করুন যে বাকীটি সঠিকভাবে প্রান্তিকভাবে সংযুক্ত হবে - কোয়ান্ট.স্ট্যাকেক্সেঞ্জের / প্রশ্নগুলি / 3094 /… ?
বেনামে

যতক্ষণ না ম্যাট্রিক্স একবিন্দু নয় এবং এগেনুয়ালুগুলির কোনওটিই শূন্য নয়, সর্বাধিক অ্যালগরিদমের ফলাফল একই হতে হবে, লক্ষণগুলিতে 180 ডিগ্রি পরিবর্তনের পরিবর্তে - যা গ্যারান্টিযুক্ত নয়।
JoleT

1

আমি যা করেছি তা হ'ল ধারাবাহিক ইগেনভেেক্টরগুলির মধ্যে এল 1 দূরত্ব গণনা করা। এই ম্যাট্রিক্সকে স্বাভাবিক করার পরে আমি এজে স্কোরের প্রান্তিকতা বেছে নিলাম উদাহরণস্বরূপ 1, যাতে কোনও নতুন ঘূর্ণায়মান পরিবর্তন যদি এই প্রান্তিকের উপরে হয় তবে আমি ঘূর্ণায়মান উইন্ডোতে ধারাবাহিকতা বজায় রাখার জন্য ইগেনভেেক্টর, গুণক এবং লোডগুলি ফ্লিপ করব। ব্যক্তিগতভাবে আমি কিছু সংযুক্তিতে প্রদত্ত লক্ষণগুলিকে জোর করা পছন্দ করি না কারণ তারা ম্যাক্রো ড্রাইভারের উপর নির্ভর করে খুব অস্থির হতে পারে।

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