R's nls () kullanarak nokta analizi


16

Ben bir "değişim noktası" analizi veya nls()R kullanarak bir çok fazlı regresyon uygulamaya çalışıyorum.

İşte yaptığım bazı sahte veriler . Verilere uymak için kullanmak istediğim formül:

y=β0+β1x+β2maksimum(0,x-δ)

Bunun yapması gereken, verileri belirli bir noktaya ve eğime ( ve ) sahip belirli bir noktaya , ardından belirli bir x değerinden ( ) sonra eğimi . Bütün maksimum şey budur. noktasından önce 0'a eşit olur ve sıfırlanır.β0β1δβ2δβ2

İşte bunu yapmak için benim işlevim:

changePoint <- function(x, b0, slope1, slope2, delta){ 
   b0 + (x*slope1) + (max(0, x-delta) * slope2)
}

Ve modeli bu şekilde takmaya çalışıyorum

nls(y ~ changePoint(x, b0, slope1, slope2, delta), 
    data = data, 
    start = c(b0 = 50, slope1 = 0, slope2 = 2, delta = 48))

Bu başlangıç ​​parametrelerini seçtim, çünkü bunların başlangıç ​​parametreleri olduğunu biliyorum , çünkü verileri uydurdum.

Ancak, bu hatayı alıyorum:

Error in nlsModel(formula, mf, start, wts) : 
  singular gradient matrix at initial parameter estimates

Az önce talihsiz veriler yaptım mı? İlk önce bunu gerçek verilere uydurmaya çalıştım ve aynı hatayı alıyordum ve ilk başlangıç ​​parametrelerimin yeterince iyi olmadığını anladım.

Yanıtlar:


12

(İlk yemek I aslında kaynaklanan bir sorun olabilir düşünce maxvectorized değildir, ancak bu doğru değildir O. Gelmez o changePoint, niçin şu değişiklikler işe bir ağrı olun:

changePoint <- function(x, b0, slope1, slope2, delta) { 
   b0 + (x*slope1) + (sapply(x-delta, function (t) max(0, t)) * slope2)
}

Bu R-yardım posta listesi direği , bu hatanın ortaya çıkabileceği bir yolu açıklar: formülün rh'leri, parametrede iki parametrenin değiştirilmesi, verilere aynı uyumu sağlayacak şekilde aşırı parametrelendirilir. Bunun modeliniz için nasıl doğru olduğunu göremiyorum, ama belki de doğrudur.

Her durumda, kendi nesnel işlevinizi yazabilir ve en aza indirebilirsiniz. Aşağıdaki işlev veri noktaları (x, y) için kare hatası verir ve parametrelerin belirli bir değerini verir (işlevin garip argüman yapısı nasıl optimçalıştığını hesaba katar ):

sqerror <- function (par, x, y) {
  sum((y - changePoint(x, par[1], par[2], par[3], par[4]))^2)
}

Sonra diyoruz ki:

optim(par = c(50, 0, 2, 48), fn = sqerror, x = x, y = data)

Ve bakın:

$par
[1] 54.53436800 -0.09283594  2.07356459 48.00000006

Sahte verilerim ( x <- 40:60; data <- changePoint(x, 50, 0, 2, 48) + rnorm(21, 0, 0.5)) için verdiğiniz ilk parametre değerlerine bağlı olarak çok sayıda yerel maksima olduğunu unutmayın. Bunu ciddiye almak istiyorsanız, rastgele ilk parametrelerle optimizasyon cihazını birçok kez çağırır ve sonuçların dağılımını incelersiniz.


Bill Venables tarafından yazılan bu yazı , bu tür analizlerde yer alan sorunları iyi açıklamaktadır.
Aaron

6
Bunun yerine (hantal) ait sapply ilk kod parçacığının çağrı, her zaman sadece kullanabilirsiniz pmax .
kardinal

0

Sadece bunu diğer birçok paketle yapabileceğinizi eklemek istedim. Değişiklik noktası çevresinde (nls'in yapamayacağı bir şey) belirsizlik tahmini almak istiyorsanız, mcppaketi deneyin .

# Simulate the data
df = data.frame(x = 1:100)
df$y = c(rnorm(20, 50, 5), rnorm(80, 50 + 1.5*(df$x[21:100] - 20), 5))

# Fit the model
model = list(
  y ~ 1,  # Intercept
  ~ 0 + x  # Joined slope
)
library(mcp)
fit = mcp(model, df)

Bir tahmin aralığı (yeşil çizgi) ile çizelim. Mavi yoğunluk, değişim noktası konumu için arka dağılımdır:

# Plot it
plot(fit, q_predict = T)

Sen kullanarak daha detaylı olarak bireysel parametreleri inceleyebilir plot_pars(fit)ve summary(fit).

resim açıklamasını buraya girin

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.