কীভাবে ডেটা মসৃণ করবেন এবং একঘেয়েমি জোর করবেন


14

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

df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))
ggplot(df, aes(x=x, y=y))+geom_line()

মসৃণ করতে ডেটা প্লট

আমি ব্যবহার করতে পারি একটি ভাল স্মুথ কৌশল কি? এছাড়াও, ভাল লাগবে যদি আমি 1 ম স্মুথড পয়েন্টটি আমার পর্যবেক্ষণের দিকের নিকটে থাকতে বাধ্য করি।


1
আমি আপনার উদাহরণ মানগুলি পূর্ণসংখ্যা হিসাবে লক্ষ্য করেছি are আপনার আসল মান গণনা করা হয়? যদি সেগুলি হয়, তবে (যদিও এটি একঘেয়েতার কোনও গ্যারান্টি নয়, যদিও এই জাতীয় ডেটার জন্য এটি এটি সাধারণত তা দেবে), এর মতো কিছু কার্যকর হতে পারে:plot(y~x,data=df); f=fitted( glm( y~ns(x,df=4), data=df,family=quasipoisson)); lines(df$x,f)
Glen_b -Rininstate মনিকা

উত্তরের সাথে অনুরূপ প্রশ্ন: stats.stackexchange.com/questions/206073/…
kjetil b halvorsen

উত্তর:


18

আপনি এমজিসিভি প্যাকেজটিতে mono.con()এবং pcls()ফাংশনগুলির মাধ্যমে একঘেয়েমি সীমাবদ্ধতার সাথে শাস্তিযুক্ত স্প্লাইনগুলি ব্যবহার করে এটি করতে পারেন । কিছুটা হতাশাবোধ আছে কারণ এই ফাংশনগুলি যেমন ব্যবহারকারী হিসাবে বন্ধুত্বপূর্ণ নয় gam(), তবে ?pclsআপনি যে নমুনা ডেটা দিয়েছেন তার অনুসারে পরিবর্তিত বেশিরভাগের উদাহরণের ভিত্তিতে নীচে দেখানো হয়েছে :

df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))

## Set up the size of the basis functions/number of knots
k <- 5
## This fits the unconstrained model but gets us smoothness parameters that
## that we will need later
unc <- gam(y ~ s(x, k = k, bs = "cr"), data = df)

## This creates the cubic spline basis functions of `x`
## It returns an object containing the penalty matrix for the spline
## among other things; see ?smooth.construct for description of each
## element in the returned object
sm <- smoothCon(s(x, k = k, bs = "cr"), df, knots = NULL)[[1]]

## This gets the constraint matrix and constraint vector that imposes
## linear constraints to enforce montonicity on a cubic regression spline
## the key thing you need to change is `up`.
## `up = TRUE` == increasing function
## `up = FALSE` == decreasing function (as per your example)
## `xp` is a vector of knot locations that we get back from smoothCon
F <- mono.con(sm$xp, up = FALSE)   # get constraints: up = FALSE == Decreasing constraint!

এখন আমাদের যে বস্তুটি pcls()ফিট করতে চাই তার জন্য দন্ডিত বাধা মডেলের বিশদ ধারণ করে সেই বস্তুটি পূরণ করতে হবে

## Fill in G, the object pcsl needs to fit; this is just what `pcls` says it needs:
## X is the model matrix (of the basis functions)
## C is the identifiability constraints - no constraints needed here
##   for the single smooth
## sp are the smoothness parameters from the unconstrained GAM
## p/xp are the knot locations again, but negated for a decreasing function
## y is the response data
## w are weights and this is fancy code for a vector of 1s of length(y)
G <- list(X = sm$X, C = matrix(0,0,0), sp = unc$sp,
          p = -sm$xp, # note the - here! This is for decreasing fits!
      y = df$y,
          w = df$y*0+1)
G$Ain <- F$A    # the monotonicity constraint matrix
G$bin <- F$b    # the monotonicity constraint vector, both from mono.con
G$S <- sm$S     # the penalty matrix for the cubic spline
G$off <- 0      # location of offsets in the penalty matrix

এখন আমরা শেষ পর্যন্ত ফিটিং করতে পারি

## Do the constrained fit 
p <- pcls(G)  # fit spline (using s.p. from unconstrained fit)

pস্প্লাইনের সাথে সম্পর্কিত বেস ফাংশনের জন্য সহগের ভেক্টর রয়েছে। লাগানো স্প্লাইনটি কল্পনা করতে, আমরা মডেলের কাছ থেকে এক্স এর ব্যাপ্তিতে 100 টি স্থানে ভবিষ্যদ্বাণী করতে পারি। প্লটে একটি সুন্দর মসৃণ লাইন পেতে আমরা 100 টি মান করি।

## predict at 100 locations over range of x - get a smooth line on the plot
newx <- with(df, data.frame(x = seq(min(x), max(x), length = 100)))

পূর্বাভাসিত মানগুলি তৈরি করতে আমরা ব্যবহার করি Predict.matrix()যা একটি ম্যাট্রিক্স উত্পন্ন করে যখন যখন সহগের একাধিক pফিটেড মডেল থেকে পূর্বাভাসিত মান দেয়:

fv <- Predict.matrix(sm, newx) %*% p
newx <- transform(newx, yhat = fv[,1])

plot(y ~ x, data = df, pch = 16)
lines(yhat ~ x, data = newx, col = "red")

এটি উত্পাদন করে:

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

জিজিপ্লাটের সাথে ষড়যন্ত্র করার জন্য একটি পরিচ্ছন্ন ফর্মের মধ্যে ডেটাটি পেতে আমি এটি আপনার কাছে রেখে দেব ...

এর বেস ফাংশনটির মাত্রা বাড়িয়ে আপনি ঘনিষ্ঠ ফিটকে (প্রথম ধাপে ধূমপানটি প্রথম ধাপে রাখার বিষয়ে আপনার প্রশ্নের আংশিক উত্তর দিতে) জোর করতে পারেন x। উদাহরণস্বরূপ, ( ) এর kসমান সেট করা এবং উপরের কোডটি পুনরায় রুনিং করা get8k <- 8

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

আপনি kএই ডেটাগুলির জন্য অনেক বেশি চাপ দিতে পারবেন না , এবং আপনাকে অতিরিক্ত ফিটিং সম্পর্কে সতর্কতা অবলম্বন করতে হবে; pcls()সীমাবদ্ধতা এবং সরবরাহিত ভিত্তিক ক্রিয়াকলাপগুলি বিবেচনা করে দণ্ডিত ন্যূনতম স্কোয়ার সমস্যা সমাধান করা সবই করছে, এটি আপনার পক্ষে মসৃণতা নির্বাচন সম্পাদন করছে না - আমি জানি না ...)

আপনি যদি বিক্ষিপ্ততা চান, তারপরে বেস আর ফাংশনটি দেখুন ?splinefunযা হেরোমাইট স্প্লাইজ এবং একঘেয়েমি সীমাবদ্ধতার সাথে ঘন স্প্লিক্স রয়েছে। এই ক্ষেত্রে আপনি এটি ব্যবহার করতে পারবেন না কারণ ডেটা কঠোরভাবে একঘেয়ে নয়।


ধন্যবাদ। আমি নিশ্চিত যে আপনার সমাধানটি যথাযথ একটি, তবে এটি এত জটিল এবং অবিচলিত যে আমি কেবল এটি ব্যবহার করতে পারি না। splinefunআমার প্রাথমিক চিন্তাও ছিল (আমি ইন্টারপোল্টিং করছি) তবে spline(x=df$x, y=df$y, n=nrow(df), method="monoH.FC")এবং spline(x=df$x, y=df$y, n=nrow(df), method="hyman")উভয়ই ত্রুটি বাড়ায়
বেন

1
আপনি যদি কেবল চেষ্টা করেন তবে আমি নিশ্চিত যে আপনি এটি ব্যবহার করতে পারবেন; এখানে হুডের নীচে কী চলছে সে সম্পর্কে আমার কম ধারণা আছে তবে আমি এটি কার্যকর করেছিলাম এবং জিনিসগুলি পরিবর্তনের জন্য আপনার প্রয়োজনীয় স্থানগুলি আমি নির্দেশ করেছি। ধরে নিচ্ছি আপনি অবশ্যই কিছু আর জানেন । বিশদটির বেশিরভাগ বাস্তবায়নমূলক যা আপনি যদি এটি করতে চান তবে তা একঘেয়েভাবে সীমাবদ্ধ স্প্লাইনে ফিট করে তবে আপনি তা উপেক্ষা করতে পারবেন। আপনি কি চাইবেন যে আমি প্রতিটি পদক্ষেপটি কী করছে সে সম্পর্কে আরও হাইলাইট করার জন্য কোডটি কিছুটা আরও বর্ধিত করতে চান? রেফারেন্সে ?mono.conপদ্ধতি সম্পর্কে আরও বিশদ রয়েছে।
মনিকা পুনরায় ইনস্টল করুন - জি সিম্পসন

কেন splinefunত্রুটি উত্থাপন করছে; আমি ঠিক বুঝতে পেরেছি, আপনি এমন একরোটিক স্প্লাইনে ফিট করতে পারেন যা ডেটা ইন্টারপোলিট করে যা নিজেই একঘেয়ে নয়। পর্যবেক্ষণ এ x = 6তুলনায় বৃহত্তর yহয় x = 5। আপনাকে কেবল উত্তরের সেই অংশটি উপেক্ষা করতে হবে :-)
মনিকা পুনরায় ইনস্টল করুন - জি। সিম্পসন

বুঝেছি. এবং কোনও প্রয়োজন নেই - আমি একজন অভিজ্ঞ অভিজ্ঞ ব্যবহারকারী। আমি কী ব্যবহার করি তার পিছনে গণিতটি বুঝতে চাই এবং এই সমাধানটি হুডের নীচে যথেষ্ট চলছে বলে মনে হয়। আপনার সাহায্যের জন্য আবার ধন্যবাদ।
বেন

প্রতিটি জিনিস কী বা কী তা বোঝাতে আমি কয়েকটি নোট যুক্ত করেছি; মূল বিষয়টি লক্ষণীয় হ'ল একচেটিয়া বাধা নির্দিষ্ট অসমতার সীমাবদ্ধতার দ্বারা আরোপিত হচ্ছে যা mono.conঘন ঘন স্প্লিনের জন্য ফিরে আসে। ?pclsপাতলা প্লেট স্প্লিনস এবং অ্যাডিটিভ মডেলগুলির উদাহরণ রয়েছে যা উপরের তুলনায় কম ব্যবহারকারী-বান্ধব, তবে যদি আপনি এই ধরণের স্প্লাইনের জন্য গণিতের সাথে পরিচিত হন তবে এটি গণিতের আরও কিছু প্রকাশ করতে পারে (আমি নিজে সে পরিচিত নই)।
মনিকা পুনরায় ইনস্টল করুন - জি। সিম্পসন

13

নাটাল্য পাইয়ার সাম্প্রতিক কেলেঙ্কারী প্যাকেজ এবং পেয়া অ্যান্ড উড (২০১৫) এর "শেপ কনস্ট্রেইনড অ্যাডিটিভ মডেল" কাগজের উপর ভিত্তি করে গ্যাভিনের দুর্দান্ত উত্তরে উল্লিখিত প্রক্রিয়াটির অংশটি আরও সহজ করে তুলতে পারে।

library(scam)
con <- scam(y ~ s(x, k = k, bs = "mpd"), data = df)
plot(con)

আপনি ব্যবহার করতে পারেন এমন অনেকগুলি বিএস ফাংশন রয়েছে - উপরেরটিতে আমি "একঘেয়েমিক হ্রাসকারী পি-স্প্লাইন" এর জন্য এমপিডি ব্যবহার করেছি তবে এটিতে এমন ফাংশন রয়েছে যা পৃথকভাবে বা মনোটোনিক সীমাবদ্ধতার পাশাপাশি উত্তেজনা বা অবতলকে প্রয়োগ করে।

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