পূর্বাভাস নির্ভুলতার গণনা


9

সময় সিরিজের ডেটা পূর্বাভাসের জন্য আমরা এসটিএল (আর বাস্তবায়ন) ব্যবহার করছি।

প্রতিদিন আমরা প্রতিদিনের পূর্বাভাস চালাই। আমরা পূর্বাভাসের মানগুলি বাস্তব মানের সাথে তুলনা করতে এবং গড় বিচ্যুতি সনাক্ত করতে চাই। উদাহরণস্বরূপ, আমরা আগামীকালের জন্য পূর্বাভাস দৌড়েছি এবং পূর্বাভাস পয়েন্ট পেয়েছি, আমরা এই পূর্বাভাসের পয়েন্টগুলিকে আমরা আসল উপাত্তের সাথে তুলনা করতে চাই যা আমরা আগামীকাল পাব। আমি সচেতন যে পূর্বাভাসের মানগুলি এবং আসল তথ্যগুলি বেশিরভাগ সময় মিলে না যায়, এটি হ'ল একটি কারণ যা আমরা আমাদের প্রতিদিন কতটা সঠিক তা ট্র্যাক রাখতে চাই।

এখন আমরা সনাক্ত করার চেষ্টা করছি এই সমস্যাটি সমাধানের জন্য সর্বোত্তম পদ্ধতির কী? কোনও সহায়তা পয়েন্টার প্রশংসা করা হবে।

আমি পূর্বাভাসের নির্ভুলতা প্রশ্নটি পরিমাপ করে দেখেছি তবে মনে হচ্ছে এটি বাস্তব মানের সাথে নির্ভুলতার গণনা না করে মডেলগুলির তুলনা করার সাথে সম্পর্কিত।

আমি আর তে নির্ভুলতা ফাংশন বাস্তবায়নের দিকে তাকিয়েছিলাম , তবে দুটি প্রশ্নের সাথে বিভ্রান্ত:

1) এটি বাস্তব তথ্য বনাম পূর্বাভাসের ডেটাতে কাজ করবে, কারণ বেশিরভাগ টিউটোরিয়াল "টেস্ট ডেটা" বনাম "পূর্বাভাস ডেটা" হিসাবে বলছে

2) এটি মনে হয় নির্ভুলতা ফাংশনটি হ'ল বিচ্যুতির পরিবর্তে মানগুলির অ্যারে।


1
দুর্দান্ত উত্তর পাওয়ার জন্য আপনাকে অবশ্যই সঠিক প্রশ্ন জিজ্ঞাসা করতে হবে - এবং এটি হতাশ হতে পারে। প্রত্যেকেই বিশ্বকে শাসন করতে চায় এবং এটি পূর্বে জ্ঞান নেয়। যদি আমার কাছে কালকের শেয়ার সম্পর্কে নিখুঁত জ্ঞান ছিল তবে আজ তা থাকলে আমি এক টন টাকা / শক্তি / সুযোগ / গৌরব ইত্যাদি তৈরি করতে পারতাম। আমি যদি আপনার সমস্যার দিকে তাকিয়ে থাকতাম তবে ভবিষ্যদ্বাণীমূলক ত্রুটির একটি হিস্টগ্রাম (বা ইসিডিএফ) দেখতে চাই। আমি পূর্বাভাসের ইনপুটগুলিকে "জিটার" পছন্দ করতে এবং এর গড় এবং প্রকরণটি দেখতে এবং ত্রুটির সাথে তুলনা করতে চাই। এটি ঠিক করতে আপনার ত্রুটিটি বুঝতে হবে।
EngrStudent

1
অবিচ্ছিন্ন জন্য, এসটিএল কি?
শ্যাডটলকার

@ এঙ্গারস্টুডেন্ট: "এটি ঠিক করতে আপনার ত্রুটিটি বুঝতে হবে" - এই বিবৃতিতে আমাদের দুটি অংশ রয়েছে। আমি প্রথম বিভাগে নিজেই সম্ভাব্য পন্থাগুলি সন্ধান করার চেষ্টা করছি। আমি যে পদ্ধতিটি গ্রহণ করি তা অংশ 2 এর জন্য কৌশলগুলি বাছতে আমাকে সহায়তা করবে
কোসা

1
সিস্টেমটি কীভাবে আচরণ করে তার গড় কথা নয়। সিস্টেম কীভাবে আচরণ করে স্ট্যান্ডার্ড বিচ্যুতি একই জিনিস নয় h দুটি ব্যবস্থা পরিমাপ করা সিস্টেম আচরণের সংক্ষিপ্ত পরিসংখ্যান। ত্রুটি নির্ভুলতা নয়। ত্রুটি অনিশ্চয়তা নয়। এই দুটি ব্যবস্থা হ'ল অর্থ ও মানক বিচ্যুতির সাথে সমতুল্য ত্রুটির সংক্ষিপ্ত পরিসংখ্যান। সিস্টেম আচরণের ব্যবস্থার অনেকগুলি অসম্পূর্ণতা যেমন রয়েছে তেমনি ত্রুটি আচরণের ব্যবস্থার অনেকগুলি ন্যূনতমতা রয়েছে। আপনার রব্রিক কি? ত্রুটি সম্পর্কে ভাবার একটি ভাল উপায় আপনি কীভাবে পরিমাপ করবেন?
EngrStudent

1
@ নামবাড়ি - "জ্ঞানী" দুনিয়াতে স্বাগতম! জ্ঞানের সূচনাটি আপনি যে কিছুই জানেন না তা জানা - একটি ছাত্র হওয়ার জন্য। আমি সর্বদা নিজেকে শেখার চেষ্টা করি, এবং যে কেউ সত্য কথা বলে তাকে সংশোধন করার চেষ্টা করে। আপনি যদি ইউরেকা সরঞ্জামটি নিয়ে খেলেন এবং যথাযথ নমুনার ডেটা উভয়ই "টার্গেট এক্সপ্রেশন" এবং প্রতিটি "ত্রুটি মেট্রিক" উভয় সাধারণ ফর্মের জন্য চেষ্টা করেন তবে আপনি এই গভীর গভীর জিনিসটি জানতে শুরু করবেন। আমার ভাল উত্তর নেই। এল'হোস্পাল (ওরফে এল 'হোপাইটাল) 1696 সালে প্রথম সর্বনিম্ন স্কোয়ার এক্সপ্রেশনটি তৈরি করেছিল A একটি ভাল শুরু হ'ল ব্যবহারের ক্ষেত্রে - যেখানে মন আসে that
EngrStudent

উত্তর:


13

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

accuracy()ফাংশন বাস্তব ডেটার উপর কাজ করে। "পরীক্ষার ডেটা" হ'ল সেই ডেটা যা পূর্বাভাস তৈরি করতে ব্যবহৃত হত না। কখনও কখনও সেগুলি উপলভ্য থাকে তবে পূর্বাভাসগুলি গণনা করা হয় না (প্রশিক্ষণ এবং পরীক্ষার সেটগুলিতে তথ্যের শাস্ত্রীয় বিভাজন)। অন্যান্য পরিস্থিতিতে, সমস্ত উপলব্ধ ডেটা পূর্বাভাসগুলি গণনা করতে ব্যবহৃত হয় এবং তারপরে পরীক্ষার ডেটা হিসাবে ব্যবহারের জন্য ভবিষ্যতের কিছু পর্যবেক্ষণ উপলব্ধ না হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হবে।

সুতরাং যদি fপূর্বাভাসের xভেক্টর হয় এবং একই সময়ের সাথে সম্পর্কিত পর্যবেক্ষণগুলির ভেক্টর হয় তবে

accuracy(f,x)

আপনি যা চান তা করবে


"শতাংশ ত্রুটির উপর ভিত্তি করে ব্যবস্থাগুলির সুদের সময়কালে ii = 0 হলে অসীম বা অপরিজ্ঞাত হওয়ার অসুবিধা এবং যখন কোনও yi শূন্যের কাছাকাছি থাকে তখন চূড়ান্ত মানগুলি রাখে" " আমি মনে করি এটি আমার ক্ষেত্রে ইস্যু হয়ে উঠবে, কারণ অনেকগুলি ক্ষেত্রেই জেরো হতে পারে। আমি এমএই গণনা করে ফলাফলের সংখ্যাটি "শতাংশে" পরিবর্তন করে ভাবছি। এটা বোঝা যায় না?
কোসা

কোনওভাবে আমার ধন্যবাদ নোট চলে গেছে, আপনার সময় ড ড হিন্ডম্যানের জন্য সত্যিই আপনাকে ধন্যবাদ!
কোসা

2

প্রথমে, স্পষ্ট করে বলি যে নির্ভুলতা এবং নির্ভুলতার ধারণা রয়েছে। যথার্থতা সাধারণত একটি পক্ষপাতিত্বের সাথে যুক্ত হয়, অর্থাত্ত্বিকদের কাছ থেকে পূর্বাভাসের পদ্ধতিগত বিচ্যুতি। যথার্থতা সাধারণত পূর্বাভাস ত্রুটির বৈকল্পিকের সাথে সম্পর্কিত। এটার মতো কিছু:একজনতোমার দর্শন লগ করাRএকটিY=()-Y বনাম পিRআমিগুলিআমিএন=ভীএকটিR[-Y]। সুতরাং, আপনি যখন আপনার পোস্টে "নির্ভুলতা" উল্লেখ করেছেন, তখন কী পার্থক্য সম্পর্কে সচেতন ছিলেন?

দ্বিতীয়ত, পূর্বাভাসের মানের যেমন সমন্বিত ব্যবস্থা রয়েছে এমএসএফ=1এনΣআমি=1এন(আমি-Yআমি)2, কোথায় আমি এবং Yআমিপূর্বাভাস এবং বাস্তব। এই পরিমাপের জন্য পরিসংখ্যান রয়েছে যেমন পরামিতি স্থিরতার জন্য চৌ পরীক্ষা।


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

@ নামবাড়ি, আপনার যদি "বিচরণের সংখ্যা" দরকার হয় তবে কেন আপনি বিচরণের সংখ্যাটি ব্যবহার করবেন না? ভবিষ্যদ্বাণীগুলির উপর একটি লুপ করুন, তাদেরকে আসল মানগুলির সাথে তুলনা করুন এবং ভবিষ্যদ্বাণীগুলি আসল মানগুলির থেকে পৃথক হওয়া সংখ্যার সংখ্যা গণনা করুন।
রোমান

2

আমি আর-তে এটি করছি এখানে নমুনা এবং বহিরাগত-নমুনা ডেটা উভয়ের জন্য আমার ডেটার জন্য আমার কোড:

#accuracy testing for out-of-sample sample#

M<-#data#
deltaT<-#set observations per year,1/4 for quarterly, 1/12 for monthly
horiz<-#set amount of forecasts required
startY<-c(#,#) #set start date
N<-head(M,-horiz)
Nu<-log(Nu)
Nu<-ts(Nu,deltat=deltaT,start=startY)

#Run your forecasting method#
##My forecasting method is arima##

N<-#data#
N<-ts(N,deltat=deltaT,start=startY)
N<-tail(N,horiz)
fitted<-ts(append(fitted(Arimab), fArimab$mean[1]), deltat=deltaT, start = startY) #where Arimab is the ARIMA model and fArimab<-forecast(Arimab, h=horiz*2, simulate= TRUE, fan=TRUE)
N<-log(N)
fitted<-head(fitted,length(N))
error<-N-fitted
percenterror<-100*error/N
plus<-N+fitted
rmse<-function(error)
  sqrt(mean(error^2))
mae<-function(error)
  mean(abs(error))
mape<-function(percenterror)
  mean(abs(percenterror))
smape<-function(error,plus)
  mean(200*abs(error)/(plus))
mse<-function(error)
  mean(error^2)
me<-function(error)
  mean(error)
mpe<-function(percenterror)
  mean(percenterror)
accuracy<-matrix(c("rmse","mae","mape","smape","mse","me","mpe",(round(rmse(error),digits=3)),(round(mae(error),digits=3)),(round(mape(percenterror),digits=3)),(round(smape(error,plus),digits=3)),(round(mse(error),digits=3)),(round(me(error),digits=3)),(round(mpe(percenterror),digits=3))),ncol=2,byrow=FALSE)
View(accuracy,title="Accuracy of ARIMA out sample")

#Accuracy testing for the in sample

M<-#data#
deltaT<-#set observations per year,1/4 for quarterly, 1/12 for monthly
horiz<-#set amount of forecasts required
startY<-c(#,#) #set start date
Nu<-log(Nu)
Nu<-ts(Nu,deltat=deltaT,start=startY)
#run your forecasting method#
fitted<-ts(append(fitted(Arimab), fArimab$mean[1]), deltat=deltaT, start = startY)
N<-exp(Nu)
fitted<-exp(fitted)
fitted<-head(fitted,length(N))
error<-N-fitted
percenterror<-100*error/N
plus<-N+fitted
rmse<-function(error)
  sqrt(mean(error^2))
mae<-function(error)
  mean(abs(error))
mape<-function(percenterror)
  mean(abs(percenterror))
smape<-function(error,plus)
  mean(200*abs(error)/(plus))
mse<-function(error)
  mean(error^2)
me<-function(error)
  mean(error)
mpe<-function(percenterror)
  mean(percenterror)
accuracy<-matrix(c("rmse","mae","mape","smape","mse","me","mpe",(round(rmse(error),digits=3)),(round(mae(error),digits=3)),(round(mape(percenterror),digits=3)),(round(smape(error,plus),digits=3)),(round(mse(error),digits=3)),(round(me(error),digits=3)),(round(mpe(percenterror),digits=3))),ncol=2,byrow=FALSE)
View(accuracy,title="Accuracy of ARIMA in sample")

আশা করি এটা কিছুটা সাহায্য করবে. আপনি যদি আমার পুরো কোডটি চান তবে আমি এটি চালাতাম দয়া করে জিজ্ঞাসা করুন এটি খুব বেসিক


1

সংক্ষিপ্ত উত্তর: আপনার পূর্বাভাসের গুণাগুণটি মূল্যায়নের জন্য, আপনি আপনার মডেলের প্রশিক্ষণ (ফিটিং) ব্যবহার করে ঠিক একই মাপ ব্যবহার করুন।

দীর্ঘ উত্তর:

আপনার পূর্বাভাসের নির্ভুলতার জন্য একটি পদক্ষেপ বেছে নেওয়ার জন্য, আপনার পূর্বাভাসকে কীভাবে ব্যাখ্যা করবেন তা আপনার প্রথম জানা দরকার। অন্য কথায়, আপনি "পূর্বাভাস" হিসাবে আসলে কী দেন? এর অর্থ কি? মধ্যমা? সবচেয়ে সম্ভাব্য মান? এই প্রশ্নের উত্তরটি অনন্যতার সাথে পূর্বাভাসের নির্ভুলতার পরিমাপ সনাক্ত করবে। আপনি যদি গড়ের পূর্বাভাস দেন তবে আপনাকে পূর্বাভাসের যথাযথতার পরিমাপ হিসাবে মূল বর্গ বিচ্যুতিটি ব্যবহার করতে হবে। আপনি যদি মিডিয়ানটি পূর্বাভাস করেন তবে আপনাকে যথার্থতার পরিমাপ হিসাবে নিখুঁত বিচ্যুতি ব্যবহার করতে হবে।

আমি এই বিষয়টিতে কিছুটা ব্যাখ্যা করব। আসুন আমরা ধরে নিই যে আপনি আগামীকালের জন্য কোনও পূর্বাভাস / পূর্বাভাস দিয়েছেন। আসুন আমরা ধরে নিই যে কালকের যে কোনও মান আপনি পর্যবেক্ষণ করতে পারেন তার জন্য আপনার একই সম্ভাবনা লক্ষ্য করা যায়। উদাহরণস্বরূপ আপনি জানেন যে আপনি সম্ভাব্যতা 0.03, সম্ভাব্যতা 0.07 সহ 2, 3 সম্ভাব্যতা 0.11 সহ আরও কিছু পর্যবেক্ষণ করতে পারেন। সুতরাং, আপনার বিভিন্ন মানের চেয়ে সম্ভাবনার বন্টন আছে। এই বিতরণটি থাকার পরে আপনি বিভিন্ন বৈশিষ্ট্য গণনা করতে পারেন এবং এটিকে আপনার "পূর্বাভাস" হিসাবে দিতে পারেন। আপনি গড় গণনা করতে পারেন এবং এটি আগামীকালের পূর্বাভাস হিসাবে দিতে পারেন। বিকল্পভাবে আপনি আপনার পূর্বাভাস হিসাবে মিডিয়ান ব্যবহার করতে পারেন। আপনি সর্বাধিক সম্ভাব্য মানও খুঁজে পেতে পারেন এবং এটি আগামীকালকে আপনার পূর্বাভাস হিসাবে দিতে পারেন।

আপনি যদি ভবিষ্যদ্বাণী হিসাবে গড় মান ব্যবহার করেন তবে "আমার ভবিষ্যদ্বাণীটির যথার্থতা কীভাবে পরিমাপ করতে হবে" প্রশ্নের চেয়ে "গড়ের জন্য নির্ভুলতার পরিমাপ কী" এবং "উত্তরটির মধ্যে মূল মূল বর্গ বিচ্যুতি" দ্বারা প্রতিস্থাপন করতে হবে বাস্তব মান এবং ভবিষ্যদ্বাণী "। আপনি যদি মিডিয়ানটিকে পূর্বাভাস হিসাবে ব্যবহার করেন তবে আপনাকে অর্থ নিখুঁত বিচ্যুতি ব্যবহার করতে হবে।

এটি হতে পারে যে আপনি জানেন না আপনি মিডিয়ান ব্যবহার করছেন বা গড় বা অন্য কিছু ব্যবহার করেছেন কিনা। আপনি ভবিষ্যদ্বাণী হিসাবে আসলে কী ব্যবহার করেন তা সন্ধানের জন্য আপনাকে প্রশিক্ষণটি কী পরিমাণে কমিয়ে আনার চেষ্টা করছেন তা জানতে হবে। আপনি যদি প্রশিক্ষণের ডেটা থেকে ভবিষ্যদ্বাণীগুলি এবং লক্ষ্য মানগুলির মধ্যে মূলকে ছোট করে এমন মডেলটির পরামিতিগুলি সন্ধান করার চেষ্টা করেন, তবে আপনার ভবিষ্যদ্বাণীগুলি গড় হিসাবে বিবেচিত হবে। যদি আপনি নিখুঁত বিচ্যুতি হ্রাস করে থাকেন, তবে আপনি মিডিয়ালগুলি প্রদান করতে আপনার মডেলটিকে প্রশিক্ষণ দিন এবং এগুলি।

যোগ করা হয়েছে

আমি একটি বিষয় জোর দিতে চাই। আমি উপরে যেমনটি উল্লেখ করেছি যে "ফিট" এবং "পূর্বাভাস" তে একই পরিমাপের যথাযথতা রাখা গুরুত্বপূর্ণ। এটির পাশাপাশি আমি এটিও বলতে চাই যে আপনি আপনার পদক্ষেপগুলি বেছে নেওয়ার ক্ষেত্রে একেবারে মুক্ত। কোনও "আরও ভাল" বা "খারাপ" ব্যবস্থা নেই। আপনি (বা আপনার ক্লায়েন্ট) আপনার পূর্বাভাসগুলি যেভাবে ব্যবহার করেন তার মাধ্যমে পরিমাপটি নির্ধারণ করা উচিত। উদাহরণস্বরূপ, একটি সঠিক মিল পাওয়া খুব গুরুত্বপূর্ণ (আপনার বা আপনার ক্লায়েন্টের কাছে) হতে পারে এবং যদি এটি না থাকে তবে আসল এবং পূর্বাভাসিত মানগুলির মধ্যে পার্থক্য বড় বা ছোট হলে এটি কোনও ভূমিকা পালন করে না। অন্যান্য ক্ষেত্রে এই পার্থক্য একটি ভূমিকা পালন করে। 1 এর পার্থক্য 2 এর পার্থক্যের চেয়ে ভাল some কিছু ক্ষেত্রে 2 এর পার্থক্য 1 এর পার্থক্যের চেয়ে 2 সময় খারাপ worse অন্যান্য ক্ষেত্রে 2 এর সমান পার্থক্য 1 এর সমান পার্থক্যের চেয়ে 100 গুণ বেশি খারাপ You আপনি বহিরাগত ক্ষেত্রে কল্পনাও করতে পারেন যাতে আপনাকে এমন মান উত্পন্ন করতে হবে যা পর্যবেক্ষণের থেকে পৃথক। সুতরাং, আপনি যে সংখ্যাগুলি তৈরি করেন তার মানের পরিমাপ আপনার প্রয়োজনের উপর নির্ভর করে আপনি যা চান তা হতে পারে। যা গুরুত্বপূর্ণ তা হল প্রশিক্ষণ (ফিট) এবং ভবিষ্যদ্বাণীগুলির মূল্যায়নের ক্ষেত্রে একই পরিমাপটি ব্যবহার করা।


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

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