Bunun stl()
için uğraşmazdım - eğilimi ortaya çıkarmak için kullanılan alçakgönüllü pürüzsüz bant genişliği gördüğünüz küçük çaplı dalgalanmalarla sonuçlanacak kadar uzak. Ek bir model kullanırdım. İşte Simon Wood'un GAM'lar kitabındaki verileri ve model kodunu kullanan bir örnek:
require(mgcv)
require(gamair)
data(cairo)
cairo2 <- within(cairo, Date <- as.Date(paste(year, month, day.of.month,
sep = "-")))
plot(temp ~ Date, data = cairo2, type = "l")
Trend ve mevsimsel bileşenlere sahip bir model takın --- bu yavaş olacaktır uyarısı :
mod <- gamm(temp ~ s(day.of.year, bs = "cc") + s(time, bs = "cr"),
data = cairo2, method = "REML",
correlation = corAR1(form = ~ 1 | year),
knots = list(day.of.year = c(0, 366)))
Takılan model şöyle görünür:
> summary(mod$gam)
Family: gaussian
Link function: identity
Formula:
temp ~ s(day.of.year, bs = "cc") + s(time, bs = "cr")
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 71.6603 0.1523 470.7 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(day.of.year) 7.092 7.092 555.407 < 2e-16 ***
s(time) 1.383 1.383 7.035 0.00345 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R-sq.(adj) = 0.848 Scale est. = 16.572 n = 3780
ve trend ve mevsim terimlerini görselleştirebiliriz.
plot(mod$gam, pages = 1)
ve eğer gözlemlenen verilere olan eğilimi çizmek istiyorsak bunu aşağıdakilerle tahmin yaparak yapabiliriz:
pred <- predict(mod$gam, newdata = cairo2, type = "terms")
ptemp <- attr(pred, "constant") + pred[,2]
plot(temp ~ Date, data = cairo2, type = "l",
xlab = "year",
ylab = expression(Temperature ~ (degree*F)))
lines(ptemp ~ Date, data = cairo2, col = "red", lwd = 2)
Veya gerçek model için aynı:
pred2 <- predict(mod$gam, newdata = cairo2)
plot(temp ~ Date, data = cairo2, type = "l",
xlab = "year",
ylab = expression(Temperature ~ (degree*F)))
lines(pred2 ~ Date, data = cairo2, col = "red", lwd = 2)
Bu sadece bir örnektir ve daha derinlemesine bir analiz birkaç eksik veri olduğu gerçeğiyle başa çıkmak zorunda kalabilir, ancak yukarıdaki iyi bir başlangıç noktası olmalıdır.
Eğilimin nasıl ölçüleceği konusundaki amacınıza gelince - bu bir problemdir, çünkü eğilim ne stl()
sürümünüzde ne de GAM sürümünde gösterdiğim gibi doğrusal değildir . Öyle olsaydı, değişim oranını (eğim) verebilirdiniz. Örnekleme dönemi boyunca tahmini eğilimin ne kadar değiştiğini bilmek istiyorsanız, içerdiği verileri kullanabilir ve yalnızca trend bileşenindeki pred
serinin başlangıcı ile bitişi arasındaki farkı hesaplayabiliriz :
> tail(pred[,2], 1) - head(pred[,2], 1)
3794
1.756163
bu nedenle sıcaklıklar, kaydın başlangıcından ortalama olarak 1,76 derece daha sıcaktır.