[GRASS-user] detrending time series maps

Ivan Marchesini ivan.marchesini at gmail.com
Fri Dec 29 10:34:32 PST 2023


Hi veronica

>
> I see what you did with creating the days time series. In that way you 
> acknowledge irregular gaps, right?
yes this is the reason
>
> However, why do you multiply by days strds? From my understanding, 
> detrending by subtracting the results of a model obbeys this rule: 
> value(t) = observed(t) - predicted(t). Then, this 
> mystrds-(regression_offset+regression_slope*days) should be 
> mystrds-(regression_offset+regression_slope*mystrds).

hmm

may be I'm wrong but I used r.regression.series to assess a relationship 
between mystrds values and time (days)

As a consequence the offset and slope maps I obtain are b and a in the 
following linear equation

y=ax+b

i.e.

predicted_mystrds=slope*days+offset

This is why I suppose that for detrending I need to do:

mystrds-(predicted_mystrds)

i.e.

mystrds-(slope*days+offset)


I'm I wrong?

thank you

Ivan



>
> Best,
> Vero
>
> El jue, 28 dic 2023 a las 8:14, Ivan Marchesini 
> (<ivan.marchesini at gmail.com>) escribió:
>
>     Dear Veronica
>
>     I think I found a simple solution using temporal raster modules.
>     Here is an example:
>
>     #evaluating info of the strds
>     eval `t.info <http://t.info> mystrds -g`
>
>     #getting the starting day (of the year, 0-365) of my strds
>     startday=$(date -d "$start_time" "+%j")
>
>     #Creating a new strds where each pixel has the value of the count
>     of the days starting from the start_day of my strds (the start day
>     in my dataset is in 2016)
>     t.rast.mapcalc inputs=mystrds
>     expression="(start_year()-2016)*365-${startday} +start_doy()"
>     output=days basename=days nprocs=xxx --o
>
>     #fitting the trend equation
>     r.regression.series xseries="`t.rast.list in=days columns=name
>     sep=, format=line`" yseries="` t.rast.list in=mystrds columns=name
>     sep=, format=line`"
>     out=regression_offset,regression_slope,regression_rsq,regression_t
>     meth=offset,slope,rsq,t
>
>     #detrending
>     t.rast.mapcalc input=mystrds,days expression="mystrds_detrend
>     = mystrds-(regression_offset+regression_slope*days)"
>     output=mystrds_detrend basename=mystrds_detrend nprocs=xxx
>     method=start --o
>
>
>     Best
>
>     Ivan
>
>
>
>
>     On 23/12/23 14:53, Ivan Marchesini wrote:
>>
>>     Hi Veronica
>>
>>     Thank you. It goes in the direction of my idea evn if my problem
>>     is exactly trying to take into account the correct gaps between
>>     that data
>>
>>     I have another idea.
>>
>>     if it works I will come back here to explain how I did
>>
>>     thank you again
>>
>>     Ivan
>>
>>
>>     On 22/12/23 13:45, Veronica Andreo wrote:
>>>     Hello Ivan,
>>>
>>>     AFAIU you could use the slope and offset maps from t.rast.series
>>>     within t.rast.algebra to detrend the values of the maps within
>>>     the strds, something like "detrended_strds = trend_strds -
>>>     (trend_strds*map(slope) + map(offset))". Others suggest, to
>>>     detrend by subtracting the previous value, i.e. that would imply
>>>     using the temporal algebra with the temporal index, something
>>>     like "detrended_strds = trend_strds[1] - trend_strds[0]".
>>>
>>>     I haven't tested any of these, just a couple of ideas ;-)
>>>     However, I do not know how this might interact with seasonality
>>>     within data, or irregular gaps.
>>>
>>>     hth somehow
>>>     Vero
>>>
>>>     El vie, 22 dic 2023 a las 5:10, Ivan Marchesini via grass-user
>>>     (<grass-user at lists.osgeo.org>) escribió:
>>>
>>>         Dear colleagues
>>>
>>>         I would like to the advantage of the t.* modules for
>>>         detrending a strd.
>>>
>>>         In the strd I have earth observation data irregularly
>>>         sampled (2 or 3
>>>         times per month), in the period November-February, for 7
>>>         years. They are
>>>         not equally spaced (i.e gaps have different duration)
>>>
>>>         A simple t.rast.series analysis (opion=slope,offset)
>>>         highlights that
>>>         probably there is a descending trend when considering the
>>>         maps ordered
>>>         by id.
>>>
>>>         I would like to fit a proper time depending fitting curve
>>>         for each pixel
>>>         and then subtract the function from the real data.
>>>
>>>         any hints on how I can do this task exploiting the GRASS GIS
>>>         modules or
>>>         some simple bash/python scripting?
>>>
>>>         thank you
>>>
>>>         Ivan
>>>
>>>
>>>
>>>
>>>         _______________________________________________
>>>         grass-user mailing list
>>>         grass-user at lists.osgeo.org
>>>         https://lists.osgeo.org/mailman/listinfo/grass-user
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20231229/6fba7f1d/attachment.htm>


More information about the grass-user mailing list