maettuw at students.unibe.ch
2016-Apr-06 14:27 UTC
[R] Extracting windows from time series
Dear R Users
Thanks for the help in advance and lets get straight to the problem:
I have a 400 year long temperature time series and I am looking for decades that
show a linear trend decrease of approximately -0.1 Kelvin or degrees. -->
What I would like to program: A loop/function / command line that prints the
values of all the trends (can also be overlapping) into a matrix that could have
the following structure :
Year 1 (of Trend1) Year 2 ( ... 2) Year 3 .....
..... .....
Trend 1:
Trend 2:
Trend 3:
...
.
.
I first tried to solve the task with a loop but ended up doing it with
function but got stuck. Here is what I did so far:
Puls <- Surface_temperature_MA10[10:394] + 1 # give all values in the TS a
positive value. Like that
## I can easier extract the trends that fullfill the searched condition
(decrease of 0.1 Kelvin) --> look next line
Difference <- diff(Puls,lag=10) # x[(1+lag):n] - x[1:(n-lag)] --> time
step 20 - timestep 10 for first calculation --> does that for whole time
series
ID <- c(1:375)
melted_Difference <- melt(data.frame(Difference,ID),id.vars="ID")
Hiatus <- subset(melted_Difference,value < -0.1)
here the result :
23 23 Difference -0.1184901
24 24 Difference -0.1723032
25 25 Difference -0.1366112
26 26 Difference -0.1745479
27 27 Difference -0.1805964
28 28 Difference -0.2285250
29 29 Difference -0.2449096
30 30 Difference -0.1052558
44 44 Difference -0.1172029
-->23,24,25 etc. corresponds to the first years of the trends that shows a
decrease of at least -0.1 Kelvin/decade. So far my method works. The purpose of
that was that I could then use the window() function to extract
the original values from Puls.
This works, but only for one decade at one time -->
List_Hiatus <- window(Puls,1,start = c(23), end =
c(34))> List_Hiatus
[1] 1.125813 1.143880 1.123572 1.139369 1.134410 1.137944 1.139320 1.055780
1.026300 1.042695 1.007323 0.971577
attr(,"tsp")
[1] 23 34 1
Tried but failed with the following approaches:
Start_H <- as.numeric(Hiatus[,1:1])
End_H <- as.numeric(Start_H + 10)
List_Hiatus <- window(Puls,1,start = "Start_H", end =
"End_H")
OR :
List_Hiatus <- window(Puls,1,start = c(23,24), end = c(33,34)) # where c
could of course be expanded
Or
apply(Puls,2,window(start=c(Start_H),end=c(End_H)))
Thanks again for your time.
Best Matthias
[[alternative HTML version deleted]]
Hi Matthias,
It looks to me as though you could do this with a couple of loops:
temps<-rnorm(400,14,0.05)
ttind<-NULL
for(ti in 1:(length(temps)-9)) {
if(temps[ti]-temps[ti+9] >= 0.1 && max(temps[ti]-temps[ti+1:9]) >
-0.05)
ttind<-c(ttind,ti)
}
cat("\t\t",paste("Year",1:10,sep=""),"\n")
for(ti in 1:length(ttind)) {
cat("Trend ",ti,":\t",sep="")
cat(round(temps[ttind[ti]:(ttind[ti]+9)],3),sep="\t","\n")
}
Whether my criteria for determining a trend is correct is another matter.
Jim
On Thu, Apr 7, 2016 at 12:27 AM, <maettuw at students.unibe.ch>
wrote:> Dear R Users
>
> Thanks for the help in advance and lets get straight to the problem:
> I have a 400 year long temperature time series and I am looking for decades
that show a linear trend decrease of approximately -0.1 Kelvin or degrees.
--> What I would like to program: A loop/function / command line that prints
the values of all the trends (can also be overlapping) into a matrix that could
have the following structure :
>
> Year 1 (of Trend1) Year 2 ( ... 2) Year 3 .....
..... .....
> Trend 1:
> Trend 2:
> Trend 3:
> ...
> .
> .
>
> I first tried to solve the task with a loop but ended up doing it with
function but got stuck. Here is what I did so far:
>
> Puls <- Surface_temperature_MA10[10:394] + 1 # give all values in the TS
a positive value. Like that
> ## I can easier extract the trends that fullfill the searched condition
(decrease of 0.1 Kelvin) --> look next line
>
> Difference <- diff(Puls,lag=10) # x[(1+lag):n] - x[1:(n-lag)] -->
time step 20 - timestep 10 for first calculation --> does that for whole time
series
> ID <- c(1:375)
> melted_Difference <-
melt(data.frame(Difference,ID),id.vars="ID")
>
> Hiatus <- subset(melted_Difference,value < -0.1)
>
> here the result :
> 23 23 Difference -0.1184901
> 24 24 Difference -0.1723032
> 25 25 Difference -0.1366112
> 26 26 Difference -0.1745479
> 27 27 Difference -0.1805964
> 28 28 Difference -0.2285250
> 29 29 Difference -0.2449096
> 30 30 Difference -0.1052558
> 44 44 Difference -0.1172029
>
> -->23,24,25 etc. corresponds to the first years of the trends that shows
a decrease of at least -0.1 Kelvin/decade. So far my method works. The purpose
of that was that I could then use the window() function to extract
> the original values from Puls.
> This works, but only for one decade at one time -->
>
> List_Hiatus <- window(Puls,1,start = c(23), end = c(34))
>> List_Hiatus
> [1] 1.125813 1.143880 1.123572 1.139369 1.134410 1.137944 1.139320
1.055780 1.026300 1.042695 1.007323 0.971577
> attr(,"tsp")
> [1] 23 34 1
>
> Tried but failed with the following approaches:
>
> Start_H <- as.numeric(Hiatus[,1:1])
> End_H <- as.numeric(Start_H + 10)
> List_Hiatus <- window(Puls,1,start = "Start_H", end =
"End_H")
>
> OR :
> List_Hiatus <- window(Puls,1,start = c(23,24), end = c(33,34)) #
where c could of course be expanded
>
> Or
> apply(Puls,2,window(start=c(Start_H),end=c(End_H)))
>
> Thanks again for your time.
>
> Best Matthias
>
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.