R [kod ve çıktı dahil] 'de rastgele efektlerle kırık bir çubuk / parçalı doğrusal modelde kırılma noktasını tahmin etme


14

Birisi bana diğer rastgele etkileri de tahmin etmem gerektiğinde R'nin parçalı doğrusal bir modelde (sabit veya rastgele bir parametre olarak) kırılma noktasını nasıl tahmin edeceğini söyleyebilir mi?

Aşağıda bir kırılma noktası için rastgele bir eğim varyansı ve rastgele bir y kesme noktası varyansı ile bir hokey sopası / kırık çubuk regresyonuna uyan bir oyuncak örneği ekledim. Kırılma noktasını belirtmek yerine tahmin etmek istiyorum. Rastgele bir etki (tercih edilir) veya sabit bir etki olabilir.

library(lme4)
str(sleepstudy)

#Basis functions
bp = 4
b1 <- function(x, bp) ifelse(x < bp, bp - x, 0)
b2 <- function(x, bp) ifelse(x < bp, 0, x - bp)

#Mixed effects model with break point = 4
(mod <- lmer(Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject), data = sleepstudy))

#Plot with break point = 4
xyplot(
        Reaction ~ Days | Subject, sleepstudy, aspect = "xy",
        layout = c(6,3), type = c("g", "p", "r"),
        xlab = "Days of sleep deprivation",
        ylab = "Average reaction time (ms)",
        panel = function(x,y) {
        panel.points(x,y)
        panel.lmline(x,y)
        pred <- predict(lm(y ~ b1(x, bp) + b2(x, bp)), newdata = data.frame(x = 0:9))
            panel.lines(0:9, pred, lwd=1, lty=2, col="red")
        }
    )

Çıktı:

Linear mixed model fit by REML 
Formula: Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject) 
   Data: sleepstudy 
  AIC  BIC logLik deviance REMLdev
 1751 1783 -865.6     1744    1731
Random effects:
 Groups   Name         Variance Std.Dev. Corr          
 Subject  (Intercept)  1709.489 41.3460                
          b1(Days, bp)   90.238  9.4994  -0.797        
          b2(Days, bp)   59.348  7.7038   0.118 -0.008 
 Residual               563.030 23.7283                
Number of obs: 180, groups: Subject, 18

Fixed effects:
             Estimate Std. Error t value
(Intercept)   289.725     10.350  27.994
b1(Days, bp)   -8.781      2.721  -3.227
b2(Days, bp)   11.710      2.184   5.362

Correlation of Fixed Effects:
            (Intr) b1(D,b
b1(Days,bp) -0.761       
b2(Days,bp) -0.054  0.181

Her bireye uygun kırık çubuk regresyonu


1
Bp'yi rastgele bir etki yapmanın herhangi bir yolu var mı?
14'te

Yanıtlar:


20

Başka bir yaklaşım, lmer'e yapılan çağrıyı kesme noktasını bir parametre olarak geçiren bir fonksiyona sarmak, daha sonra optimize edilmiş modelin optimize etme kullanarak kesme noktasına bağlı olarak sapmasını en aza indirmek olacaktır. Bu , kesme noktası için profil günlüğü olasılığını en üst düzeye çıkarır ve genel olarak (yani, sadece bu sorun için değil), sargının içindeki işlev (bu durumda lmer), kendisine iletilen parametreye bağlı olarak maksimum olasılık tahminlerini bulursa, tüm prosedürü tüm parametreler için birleşik maksimum olabilirlik tahminlerini bulur.

library(lme4)
str(sleepstudy)

#Basis functions
bp = 4
b1 <- function(x, bp) ifelse(x < bp, bp - x, 0)
b2 <- function(x, bp) ifelse(x < bp, 0, x - bp)

#Wrapper for Mixed effects model with variable break point
foo <- function(bp)
{
  mod <- lmer(Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject), data = sleepstudy)
  deviance(mod)
}

search.range <- c(min(sleepstudy$Days)+0.5,max(sleepstudy$Days)-0.5)
foo.opt <- optimize(foo, interval = search.range)
bp <- foo.opt$minimum
bp
[1] 6.071932
mod <- lmer(Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject), data = sleepstudy)

Kesme noktası için bir güven aralığı elde etmek için profil olasılığını kullanabilirsiniz . Örneğin, qchisq(0.95,1)minimum sapmaya (% 95 güven aralığı için) ekleyin, sonra foo(x)hesaplanan değere eşit olan noktaları arayın :

foo.root <- function(bp, tgt)
{
  foo(bp) - tgt
}
tgt <- foo.opt$objective + qchisq(0.95,1)
lb95 <- uniroot(foo.root, lower=search.range[1], upper=bp, tgt=tgt)
ub95 <- uniroot(foo.root, lower=bp, upper=search.range[2], tgt=tgt)
lb95$root
[1] 5.754051
ub95$root
[1] 6.923529

Bu oyuncak problemi için biraz asimetrik, ama kötü değil. Bir alternatif, önyüklemeyi güvenilir hale getirmek için yeterli veriye sahipseniz, tahmin prosedürünü önyüklemek olacaktır.


Teşekkür ederim - bu çok yardımcı oldu. Bu tekniğe iki aşamalı bir tahmin prosedürü mü deniyor, yoksa başvurabileceğim / bakabileceğim standart bir adı var mı?
lockedoff

Bu en büyük olasılıktır, ya da lmer olasılığı en üst düzeye çıkarırsa olurdu (varsayılanın aslında REML olduğunu düşünüyorum, ML tahminlerini almak için lmer'e bir REML = FALSE parametresi geçirmeniz gerekir). sadece bir kerede değil, iç içe bir şekilde tahmin edilir. Cevabın önüne biraz açıklama ekledim.
jbowman

Gerçek verilerimle profil olasılığını tersine çevirirken bazı optimizasyon sorunları ve geniş CI'lerim vardı, ancak uygulamamda daha dar bootstrap CI'ları var. Deneklerin veri vektörlerinin değiştirilmesiyle örnekleme ile parametrik olmayan bir önyükleme öngörüyor muydunuz? Yani, uykulu veriler için, bu, bir konunun veri vektörü içinde herhangi bir yeniden örnekleme yapmadan, 10 veri noktasının 18 (konu) vektörünün değiştirilmesiyle örnekleme gerektirecektir.
lockedoff

Evet, tarif ettiğiniz gibi parametrik olmayan bir bootstrap öngörüyordum, ama kısmen bunun nedeni, uygulanabilir (veya olmayabilir) gelişmiş bootstrap teknikleri hakkında çok fazla bilgim yok. Profil olabilirlik tabanlı CI'ler ve bootstrap hem asimptotik olarak doğrudur, ancak bootstrap'in numuneniz için önemli ölçüde daha iyi olması iyi olabilir.
jbowman

5

Jbowman tarafından önerilen çözüm çok iyi, sadece birkaç teorik açıklama ekliyor:

  • Kullanılan gösterge fonksiyonunun süreksizliği göz önüne alındığında, profil olasılığı çok sayıda yerel minima ile oldukça düzensiz olabilir, bu nedenle olağan optimize ediciler çalışmayabilir. Bu tür "eşik modelleri" için olağan çözüm, yerine getirilen her olası kırılma noktası / eşik günündeki (ve kodda yapıldığı gibi aradaki değerlerde değil) sapmayı değerlendiren daha hantal ızgara araması kullanmaktır. Alttaki koda bakın.

  • Kesme noktasının tahmin edildiği bu standart dışı modelde, sapma genellikle standart dağılıma sahip değildir. Genellikle daha karmaşık prosedürler kullanılır. Aşağıdaki Hansen (2000) referansına bakınız.

  • Bootstrap bu konuda her zaman tutarlı değildir, aşağıdaki Yu'ya (gelecek) bakınız.

  • Son olarak, günleri neden yeniden merkezleyerek verileri dönüştürdüğün net değil (yani, sadece x yerine bp - x). İki sorun görüyorum:

    1. Bu prosedürle, 6.1 gün, 4.1 vb. (standart bir kesme noktası modelinde, 6 ile 7 arasındaki eşiğin herhangi bir değeri size aynı kat / sapmayı vermelidir)
    2. b1 ve b2 ters anlama sahiptir, çünkü b1 günleri için azalırken, b2 için artarken? Yani kesme noktasının gayri resmi testi b1! = - b2

Bunun için standart referanslar:

  • Standart OLS: Hansen (2000) Numune Bölme ve Eşik Tahmini, Econometrica, Vol. 68, No. 3. (Mayıs 2000), sayfa 575-603.
  • Daha egzotik modeller: Lee, Seo, Shin (2011) Regresyon modellerinde eşik etkilerini test etme, Amerikan İstatistik Derneği Dergisi (Teori ve Yöntemler) (2011), 106, 220-231
  • Ping Yu (gelecek) Eşik Regresyonunda Bootstrap ", Ekonometrik Teori.

Kod:

# Using grid search over existing values:
search.grid <- sort(unique(subset(sleepstudy, Days > search.range[1] &
Days<search.range[2], "Days", drop=TRUE)))

res <- unlist(lapply(as.list(search.grid), foo))

plot(search.grid, res, type="l")
bp_grid <- search.grid[which.min(res)]

0

Bir MARS modelini deneyebilirsiniz . Ancak, rastgele efektlerin nasıl belirtileceğinden emin değilim. earth(Reaction~Days+Subject, sleepstudy)


1
Teşekkürler - Paket belgelerine göz attım ama rastgele efektleri desteklemedi.
lockedoff

0

Bu karışık etkiler MARS öneren bir makaledir. @Lockedoff'un da bahsettiği gibi, aynı pakette herhangi bir uygulama görmüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.