Cum să găsiți tendința liniară în R? (Programare, R)

Dan Schmidt a intrebat.

Am o matrice cu aproximativ 160 de puncte de date. Mă interesează să aflu dacă o parte din acea serie(nu trebuie să fie toată seria) are un trend (liniar și fie crescător/decrescător). Mă interesează să aflu doar trendul liniar și nu trendurile neliniare.

Aș începe prin a-l testa pe un set de date de bază de forma:

    A<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
16,17,17,18,17,17,18,17,17,18,19,19,19,19,19,19,19,19,19,19,19)

Aici, doar prin simpla reprezentare grafică a datelor, aș crede că tendința este ascendentă de la 1:17 și aș dori să introduc manechine pentru aceasta (ceea ce voi putea face odată ce voi cunoaște punctul de început și punctul final al tendinței). Există vreo modalitate de a ști acest lucru? ÎN R?

Comentarii

  • Pentru a găsi o tendință liniară aveți nevoie de cel puțin 2 variabile. Cum ar trebui să vedem o tendință în vectorul dvs.? Dacă îl puneți de la 1 la 19, veți vedea o tendință crescătoare, iar dacă îl puneți de la 19 la 1, veți vedea o tendință descrescătoare. –  > Por Kalees Waran.
  • Nu sunt foarte sigur de ceea ce înțelegeți prin 2 variabile. În seriile de timp, tendința se calculează doar pe o singură variabilă, nu pe două. –  > Por Dan Schmidt.
  • Cred că în seriile temporale se trasează între timp și frecvență. Vedeți două variabile aici. –  > Por Kalees Waran.
  • Da, dar se presupune că acestea sunt prezente într-un format de serie de timp dacă fac transformarea ts. Funcția ts presupune că toate valorile din A sunt la o perioadă de timp distanță. –  > Por Dan Schmidt.
3 răspunsuri
Roland
A<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
     16,17,17,18,17,17,18,17,17,18,19,19,19,19,19,19,19,19,19,19,19)
x <- seq_along(A)

plot(A ~ x)

fit0 <- lm(A ~ x)

library(segmented)
fit1 <- segmented(fit0, seg.Z = ~ x, psi = list(x = c(10, 40)))
summary(fit1)
#Estimated Break-Point(s):
#         Est. St.Err
#psi1.x 18.00  0.220
#psi2.x 34.04  0.246


lines(x, predict(fit1), col = "red")

Comentarii

  • Domnule, asta este pentru mai multe tendințe? –  > Por Dan Schmidt.
H.Sechier

Verificați lm funcția. Această funcție vă ajută să creați o regresie liniară.

A<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,17,18,17,17,18,17,17,18,19,19,19,19,19,19,19,19,19,19,19)
x = c(1:length(A))  
plot(x,A)
reg = lm(A~x)
abline(reg,col="red")

Și dacă doriți să începeți regresia liniară la un punct startPoint, utilizați `A[startPoint:length(A)]

Și pentru a cunoaște tendința : print(reg)

Comentarii

  • Dar această linie de trend este pentru întregul set de date, nu? –  > Por Dan Schmidt.
  • Vreau ca R să prezică dacă există o tendință liniară și, dacă da, atunci de la ce punct la ce punct. Astfel încât să pot adăuga o marjă de eroare pentru același lucru. –  > Por Dan Schmidt.
  • Deci, priviți summary(reg). Acest lucru vă ajută să știți dacă există o tendință liniară sau nu cu valoarea p (Pr(>|t|)). Valoarea de pe rândul x trebuie să fie <2e-16 –  > Por H.Sechier.
  • Și pentru a ști de la ce punct începeți, trebuie să faceți o buclă pe un punct de pornire și să creați de fiecare dată o regresie liniară și să verificați dacă există sau nu o tendință (cu valoarea p).  > Por H.Sechier.
  • Dar atunci îmi poate arăta mai multe tendințe, deoarece ipoteza nulă poate fi respinsă în mai multe puncte și, prin urmare, poate da tendințe suprapuse? –  > Por Dan Schmidt.
r.user.05apr

Funcția de descompunere ar putea fi de ajutor. O manechină ar putea să nu fie suficient de sensibilă. S-ar putea să doriți doar să scădeți componenta de tendință. Încercați:

A<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
 16,17,17,18,17,17,18,17,17,18,19,19,19,19,19,19,19,19,19,19,19)

# convert to ts first
my.ts <- ts(A, start = c(2000, 1), freq = 12) # .. if you have months
my.trend <- decompose(my.ts)$trend
print(max(diff(my.trend), na.rm = TRUE))

# use a certain percentage of max difference to find start and end of trend
tolerance <- 0.1 # say 10 % ..
trend.start <- which.max(my.trend >= tolerance * max(my.trend, na.rm=T))
trend.end <- which.max(my.trend >= (1-tolerance) * max(my.trend, na.rm=T))

# plot shows that it - almost - fits
plot(my.ts, col = "blue", type = "o")
abline(v = time(my.ts)[trend.start], col = "gray") 
abline(v = time(my.ts)[trend.end], col = "gray")
lines(my.trend)

# but what do you do, if you have a ts like this ..
B <- c(rep(0,50), seq(1,30,0.5), rep(30,50), seq(30,1,-1)) + rnorm (189,0,1)
my.ts <- ts(B, start = c(2000, 01), freq = 12)
plot(my.ts)
my.trend <- decompose(my.ts)$trend
plot(my.trend)

Comentarii

  • Domnule, acest lucru funcționează foarte bine, dar nu sunt sigur ce se întâmplă aici…  > Por Dan Schmidt.
  • Domnule, o întrebare: dacă am date săptămânale, cum introduc frecvența? Am date pe 3 ani și săptămânale. Am, de asemenea, datele pentru aceste puncte de date. –  > Por Dan Schmidt.
  • Și în ts împărtășite de dvs. în ultima parte a răspunsului dvs., pot vedea că metoda dvs. detectează doar o tendință ascendentă? De asemenea, ați spus să folosiți un anumit procent din diferența maximă, dar nu l-ați folosit și ați folosit doar valoarea maximă înmulțită cu nivelul de toleranță? –  > Por Dan Schmidt.

Tags: