আর-তে লস রিগ্রেশনটিতে কী স্প্যান ব্যবহার করবেন তা আমি কীভাবে সিদ্ধান্ত নেব?


26

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

এখানে নমুনা আকার আছে:

Fastballs vs RHH 2008-09: 2002
Fastballs vs LHH 2008-09: 2209
Fastballs vs RHH 2010: 527 
Fastballs vs LHH 2010: 449

Changeups vs RHH 2008-09: 365
Changeups vs LHH 2008-09: 824
Changeups vs RHH 2010: 201
Changeups vs LHH 2010: 330

Curveballs vs RHH 2008-09: 488
Curveballs vs LHH 2008-09: 483
Curveballs vs RHH 2010: 213
Curveballs vs LHH 2010: 162

লস রিগ্রেশন মডেলটি একটি পৃষ্ঠের ফিট, যেখানে প্রতিটি বেসবল পিচের এক্স অবস্থান এবং ওয়াই অবস্থানটি ডাব্লু স্ট্রাইক সম্ভাবনার ঝুলিতে পূর্বাভাস দেওয়ার জন্য ব্যবহৃত হয়। যাইহোক, আমি এই সমস্ত মডেলের 12 টির মধ্যে তুলনা করতে চাই, তবে একই স্প্যানটি সেট করা (অর্থাত্ স্প্যান = ০.৫) বিভিন্ন ধরণের নমুনা আকারের উপস্থিতি থেকে বিভিন্ন ফলাফল আসবে।

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

আমার কি করা উচিৎ? আর-তে কম রিগ্রেশন মডেলগুলির জন্য স্প্যান সেট করার সময় থাম্বের একটি ভাল নিয়ম কী? আগাম ধন্যবাদ!


লক্ষ্য করুন যে স্প্যান পরিমাপের অর্থ বিভিন্ন সংখ্যক পর্যবেক্ষণের জন্য বিভিন্ন উইন্ডোর আকারের অর্থ।
তাল গ্যালি

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

উত্তর:


14

একটি ক্রস-বৈধকরণ প্রায়শই ব্যবহৃত হয়, উদাহরণস্বরূপ কে- ভাঁজ, যদি লক্ষ্যটি হয় সর্বনিম্ন আরএমএসইপি সহ ফিট find আপনার ডেটা কে- গ্রুপে বিভক্ত করুন এবং প্রতিটি গ্রুপকে ঘুরে ফিরে, কে -1 গ্রুপের ডেটা এবং স্মুথিং প্যারামিটারের একটি নির্বাচিত মান ব্যবহার করে একটি লোয়েস মডেল ফিট করুন এবং বাম আউট গ্রুপের পূর্বাভাস দেওয়ার জন্য সেই মডেলটি ব্যবহার করুন। বাম আউট গ্রুপের জন্য পূর্বাভাসকৃত মানগুলি সংরক্ষণ করুন এবং তারপরে প্রতিটি কে গ্রুপে একবার বাদ না দেওয়া পর্যন্ত পুনরাবৃত্তি করুন । পূর্বাভাসিত মানগুলির সেটটি ব্যবহার করে আরএমএসইপ গণনা করুন। তারপরে আপনি যে টিউটোরিং প্যারামিটারটি টিউন করতে চান তার প্রতিটি মানের জন্য পুরো জিনিসটি পুনরাবৃত্তি করুন। সিভিয়ের আওতায় সর্বনিম্ন আরএমএসইপ দেয় এমন স্মুথিং পরামিতি নির্বাচন করুন।

এটি, আপনি দেখতে পাচ্ছেন, মোটামুটি গণনা ভারী। আমি অবাক হব যদি আপনি স্বল্প সিভি ব্যবহারের জন্য সত্যিকারের সিভির কোনও সাধারণীকরণের ক্রস-বৈধকরণ (জিসিভি) বিকল্প না থাকতেন - হাসটি এট আল (বিভাগ .2.২) ইঙ্গিত দেয় যে এটি করা খুব সহজ এবং তাদের একটি অনুশীলনে আবৃত রয়েছে ।

আমি আপনাকে হস্টি এট আল এর অধ্যায় 5 এর 6.1.1, 6.1.2 এবং 6.2, এবং স্মুথ স্প্লাইংগুলি (যেমন সামগ্রী এখানেও প্রযোজ্য) নিয়মিতকরণের বিভাগগুলি পড়ার পরামর্শ দিচ্ছি। (২০০৯) পরিসংখ্যানগত শিক্ষার উপাদানসমূহ: ডেটা মাইনিং, অনুমান এবং পূর্বাভাস । দ্বিতীয় সংস্করণ। স্প্রিঙ্গের। পিডিএফটি বিনামূল্যে ডাউনলোড করা যায়।


8

আমি জেনারেলাইজড অ্যাডিটিভ মডেলগুলি পরীক্ষা করার পরামর্শ দিই (জিএএম, আর-তে এমজিসিভি প্যাকেজটি দেখুন)। আমি কেবল তাদের সম্পর্কে নিজেই শিখছি, তবে তারা "উইগ্লি-নেস" ডেটা দ্বারা কতটা ন্যায়সঙ্গত তা স্বয়ংক্রিয়ভাবে নির্ধারণ করে। আমি আরও দেখতে পেলাম যে আপনি দ্বিপদী ডেটা (স্ট্রাইক বনাম স্ট্রাইক নয়) নিয়ে কাজ করছেন, সুতরাং কাঁচা ডেটা বিশ্লেষণ করতে ভুলবেন না (যেমন অনুপাতে সমষ্টি করবেন না, কাঁচা পিচ-বাই-পিচ ডেটা ব্যবহার করুন) এবং পরিবার = ব্যবহার করুন 'দ্বিপদী' (ধরে নিচ্ছেন যে আপনি আর ব্যবহার করছেন) যদি পৃথক কলস এবং হিটারগুলি ডেটাতে কী অবদান রাখছে সে সম্পর্কে আপনার কাছে যদি তথ্য থাকে তবে আপনি সম্ভবত একটি সাধারণীকরণযোগ্য মিশ্র মডেল (জিএএমএম, আর-এ গ্যাম 4 প্যাকেজটি দেখুন) এবং কলস এবং হিটারকে এলোমেলো প্রভাব হিসাবে নির্দিষ্ট করে (এবং আবার) আপনার শক্তি বাড়িয়ে তুলতে পারেন , সেটিং পরিবার = 'দ্বিপদী')। অবশেষে, আপনি সম্ভবত এক্স ও ওয়াইয়ের স্মুথগুলির মধ্যে একটি কথোপকথনের জন্য অনুমতি দিতে চান, তবে আমি নিজেই এটি চেষ্টা করেছিলাম তাই আমি কীভাবে এটি জানি না। এক্স * ওয়াই ইন্টারঅ্যাকশন ছাড়াই একটি গ্যাম 4 মডেলটি দেখতে দেখতে দেখতে পাবেন:

fit = gamm4(
    formula = strike ~ s(X) + s(Y) + pitch_type*batter_handedness + (1|pitcher) + (1|batter)
    , data = my_data
    , family = 'binomial'
)
summary(fit$gam)

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

my_data$dummy = factor(paste(my_data$pitch_type,my_data$batter_handedness))
fit = gamm4(
    formula = strike ~ s(X,by=dummy) + s(Y,by=dummy) + pitch_type*batter_handedness + (1|pitcher) + (1|batter)
    , data = my_data
    , family = 'binomial'
)
summary(fit$gam)

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


এটি প্রদর্শিত হয় যে ggplot ডিফল্টরূপে N> 1000 ডেটাপয়েন্টগুলির জন্য তার জিওম_স্মোথ ফাংশনের জন্য জিএএম ব্যবহার করে।
উদাহরণস্বরূপ পরিসংখ্যান শেখা

6

অল্প পরিসংখ্যানের জন্য, অ-পরিসংখ্যানবিদ হিসাবে আমার বোঝাপড়াটি হ'ল আপনি ভিজ্যুয়াল ব্যাখ্যার উপর ভিত্তি করে আপনার স্প্যানটি বেছে নিতে পারেন (অসংখ্য স্প্যান ভ্যালু সমেত প্লটটি ন্যূনতম পরিমাণে স্মুথিংয়ের উপযুক্ত বেছে নিতে পারে যা উপযুক্ত বলে মনে হয়) বা আপনি ক্রস বৈধতা ব্যবহার করতে পারেন (সিভি) বা সাধারণীকরণের ক্রস বৈধকরণ (জিসিভি)। নীচে আমি টেকজাওয়ার দুর্দান্ত বইয়ের কোডের উপর ভিত্তি করে লোস রিগ্রেশনটির জিসিভি ব্যবহার করেছি, ননপ্যারমেট্রিক রিগ্রেশন (পি 219 থেকে) এর পরিচিতির কোডের ভিত্তিতে লোস রিগ্রেশনের জিসিভি ব্যবহার করেছি used

locv1 <- function(x1, y1, nd, span, ntrial)
{
locvgcv <- function(sp, x1, y1)
{
    nd <- length(x1)

    assign("data1", data.frame(xx1 = x1, yy1 = y1))
    fit.lo <- loess(yy1 ~ xx1, data = data1, span = sp, family = "gaussian", degree = 2, surface = "direct")
    res <- residuals(fit.lo)

    dhat2 <- function(x1, sp)
    {
        nd2 <- length(x1)
        diag1 <- diag(nd2)
        dhat <- rep(0, length = nd2)

        for(jj in 1:nd2){
            y2 <- diag1[, jj]
            assign("data1", data.frame(xx1 = x1, yy1 = y2))
            fit.lo <- loess(yy1 ~ xx1, data = data1, span = sp, family = "gaussian", degree = 2, surface = "direct")
            ey <- fitted.values(fit.lo)
            dhat[jj] <- ey[jj]
            }
            return(dhat)
        }

        dhat <- dhat2(x1, sp)
        trhat <- sum(dhat)
        sse <- sum(res^2)

        cv <- sum((res/(1 - dhat))^2)/nd
        gcv <- sse/(nd * (1 - (trhat/nd))^2)

        return(gcv)
    }

    gcv <- lapply(as.list(span1), locvgcv, x1 = x1, y1 = y1)
    #cvgcv <- unlist(cvgcv)
    #cv <- cvgcv[attr(cvgcv, "names") == "cv"]
    #gcv <- cvgcv[attr(cvgcv, "names") == "gcv"]

    return(gcv)
}

এবং আমার ডেটা সহ, আমি নিম্নলিখিতগুলি করেছি:

nd <- length(Edge2$Distance)
xx <- Edge2$Distance
yy <- lcap

ntrial <- 50
span1 <- seq(from = 0.5, by = 0.01, length = ntrial)

output.lo <- locv1(xx, yy, nd, span1, ntrial)
#cv <- output.lo
gcv <- output.lo

plot(span1, gcv, type = "n", xlab = "span", ylab = "GCV")
points(span1, gcv, pch = 3)
lines(span1, gcv, lwd = 2)
gpcvmin <- seq(along = gcv)[gcv == min(gcv)]
spangcv <- span1[pgcvmin]
gcvmin <- cv[pgcvmin]
points(spangcv, gcvmin, cex = 1, pch = 15)

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


3

আপনি যদি জেনারলাইজড অ্যাডেটিভ মডেলটিতে স্যুইচ করেন, আপনি এমজিসিভি প্যাকেজ gam()থেকে ফাংশনটি ব্যবহার করতে পারেন , এতে লেখক আমাদের আশ্বাস দিয়েছেন :

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

( kএখানে মসৃণতার জন্য স্বাধীনতার প্যারামিটারের ডিগ্রি রয়েছে, যা 'মসৃণতা পরামিতিটি দেখানোর অনুরূপ)


ধন্যবাদ মাইক :) আমি পূর্বের উত্তরগুলি থেকে দেখেছি আপনি গ্যামের উপর দৃ strong়। ভবিষ্যতে আমি এটির একটি
নজরে

2

আপনি আপনার নিজের ক্রস বৈধকরণ লুপটি স্ক্র্যাচ থেকে লিখতে পারেন loess()যা statsপ্যাকেজ থেকে ফাংশনটি ব্যবহার করে ।

  1. একটি খেলনা ডেটা ফ্রেম সেট আপ করুন।

    set.seed(4)
    x <- rnorm(n = 500)
    y <- (x)^3 + (x - 3)^2 + (x - 8) - 1 + rnorm(n = 500, sd = 0.5)
    plot(x, y)
    df <- data.frame(x, y)
  2. ক্রস-বৈধতা লুপ পরিচালনা করতে দরকারী ভেরিয়েবল সেট আপ করুন।

    span.seq <- seq(from = 0.15, to = 0.95, by = 0.05) #explores range of spans
    k <- 10 #number of folds
    set.seed(1) # replicate results
    folds <- sample(x = 1:k, size = length(x), replace = TRUE)
    cv.error.mtrx <- matrix(rep(x = NA, times = k * length(span.seq)), 
                            nrow = length(span.seq), ncol = k)
  3. forপ্রতিটি স্প্যান সম্ভাব্যতার উপরে নেস্টেড লুপটি পুনরাবৃত্তি করুন span.seqএবং প্রতিটি ফোল্ড ইন করুন folds

    for(i in 1:length(span.seq)) {
      for(j in 1:k) {
        loess.fit <- loess(formula = y ~ x, data = df[folds != j, ], span = span.seq[i])
        preds <- predict(object = loess.fit, newdata = df[folds == j, ])
        cv.error.mtrx[i, j] <- mean((df$y[folds == j] - preds)^2, na.rm = TRUE)
        # some predictions result in `NA` because of the `x` ranges in each fold
     }
    }
  4. CV(10)=110i=110MSEi
    cv.errors <- rowMeans(cv.error.mtrx)
  5. MSE

    best.span.i <- which.min(cv.errors)
    best.span.i
    span.seq[best.span.i]
  6. আপনার ফলাফল প্লট করুন।

    plot(x = span.seq, y = cv.errors, type = "l", main = "CV Plot")
    points(x = span.seq, y = cv.errors, 
           pch = 20, cex = 0.75, col = "blue")
    points(x = span.seq[best.span.i], y = cv.errors[best.span.i], 
           pch = 20, cex = 1, col = "red")
    
    best.loess.fit <- loess(formula = y ~ x, data = df, 
                            span = span.seq[best.span.i])
    
    x.seq <- seq(from = min(x), to = max(x), length = 100)
    
    plot(x = df$x, y = df$y, main = "Best Span Plot")
    lines(x = x.seq, y = predict(object = best.loess.fit, 
                                 newdata = data.frame(x = x.seq)), 
          col = "red", lwd = 2)

@ হাইসো, সাইটে আপনাকে স্বাগতম। এটি একটি ভাল উত্তর (+1), এবং সাইটের স্বরূপকরণ বিকল্পগুলি আপনার ব্যবহারের জন্য আমি প্রশংসা করি। নোট করুন যে আমাদের আর-নির্দিষ্ট সাইট হওয়ার কথা নয় এবং এই প্রশ্নটি পোস্ট হওয়ার পরে years বছরে বিশেষত আর সম্পর্কে প্রশ্নের জন্য আমাদের সহনশীলতা হ্রাস পেয়েছে। সংক্ষেপে, এটা ভালো হতে পারে আপনি ভবিষ্যতে দর্শকদের জন্য এই W / pseudocode হয় যারা আর পড়া না বৃদ্ধি পারে
পুনর্বহাল মনিকা - gung

শীতল, টিপস @ গুং এর জন্য ধন্যবাদ। আমি সিউডোকোড যুক্ত করার কাজ করব।
hynso


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