[ncl-talk] Help in saving values in looping

Adam Phillips asphilli at ucar.edu
Wed Jun 7 14:30:18 MDT 2017


Hi Andreas,
Based on that snippet of code the only line I see where you may be dividing
by zero is this line:
*test_rc_nies = regline_stats(ntimes3,value_test_nies({i:j}))*

Following through your do loops you will have iterations when both input
arrays are of size 1 (when say i *and* j = 1989).

Quick testing here shows that each of the input arrays need to be of size 3
or greater to avoid triggering that error message of dividing by 0. To
avoid this situation you can change your code to this to make sure more
than 2 values are input into regline_stats:

if (j-i.ge.2) then
*   test_rc_nies = regline_stats(ntimes3,value_test_nies({i:j}))*




*    if (j-i .ge. 9) then               finarr_nies({i},{j},0) =
where(test_rc_nies at b(1) .gt. 0 .and. test_rc_nies at b95(0) .gt. 0 ,
finarr_nies({i},{j},0), value_test at _FillValue )           else
   finarr_nies({i},{j},0) = where(test_rc_nies at b(1) .lt. 0 .and.
test_rc_nies at b95(1) .lt. 0 , finarr_nies({i},{j},0), value_test at _FillValue
)            end if*
end if

Hope that helps. If not, or if you have further questions please respond to
ncl-talk...
Adam

On Wed, Jun 7, 2017 at 1:16 PM, Andreas Chrysanthou <eeac at leeds.ac.uk>
wrote:

> Following up on the loop I created, when I tried to add some criteria
> based on the slope of the linear trend and the regression coefficients in
> order to save them to a new array I got the error:
>
>
> *fatal:divide: Division by 0, Can't continue fatal:Div: operator failed,
> can't continue*
>
> I want to store the calculated value only when it meets one of the
> following criteria.
> Any ideas on how to improve the syntax? Or ways to bypass the problem?
>
> I’ve read on the NCL website in the lazy evaluation section that: "If the
> left operand is an array, you cannot depend on a left-hand side test to
> guard against possible error conditions resulting from evaluating an
> expression on the right side. For example, you cannot avoid division by 0
> and the consequences of an error result…”
>
> The snippet of the code is:
>
> *finarr_nies = new((/22,22,1/),typeof(value_test))*
> *finarr_nies!0 = "startyear"*
> *finarr_nies&startyear = ispan(1980,2001,1)*
> *finarr_nies!1 = "endyear"*
> *finarr_nies&endyear = ispan(1989,2010,1)*
>
>
>
>
>
>
> *do i=1980,2001,1    do j=1989,2010,1         ntimes3      =  ispan(i,j,1)
>         start_date   = i         end_date    = j         test_rc_nies =
> regline_stats(ntimes3,value_test_nies({i:j}))*
>
>
>
>
>
>
>
> * if (j-i .ge. 9) then             finarr_nies({i},{j},0) =
> where(test_rc_nies at b(1) .gt. 0 .and. test_rc_nies at b95(0) .gt. 0 ,
> finarr_nies({i},{j},0), value_test at _FillValue )         else
> finarr_nies({i},{j},0) = where(test_rc_nies at b(1) .lt. 0 .and.
> test_rc_nies at b95(1) .lt. 0 , finarr_nies({i},{j},0), value_test at _FillValue
> )          end if         delete(ntimes3)     end do end do*
>
>
> Cheers,
> Andreas
>
> On 6 Jun 2017, at 13:22, Andreas Chrysanthou <eeac at leeds.ac.uk> wrote:
>
> I really appreciate your help Adam and Dennis.
>
> I could manage to extract the one value I wanted from the slope and the
> regression coefficients, pass it on to the new array outside of the loop
> and improved the code by writing the loop with variables instead of
> constants.
>
> Thanks so much.
>
>
>
> On 6 Jun 2017, at 01:29, Dennis Shea <shea at ucar.edu> wrote:
>
> I am not sure what is meant by: "There was one not insignificant thing I
> didn’t mention"
>
> ---
> As you note:
>
> "the regline_stats function for the b calculates  both the b(0) +b(1*)x of
> the linear regression, while the b95 calculates both the 2.5% and 97.5%
> regression coefficient confidence intervals. So when it tries to save to
> that cell, there are two values for the @b and @b95."
>
> Change:
>         trend_slope=test_rc at b*10  ; prints slope of the linear trend for
> the selected range of years
>         reg_coeff=test_rc at b95         ; prints 2.5% and 97.5% regression
> coefficient confidence intervals
>
> To extract only one value
>         trend_slope=test_rc at b(1) *10  ; prints slope of the linear trend
> for the selected range of years
>         reg_coeff=test_rc at b95(1)          ; prints 2.5% and 97.5%
> regression coefficient confidence intervals
>
> ---
>
> "4 different columns (start_date, end_date,trend_slope,reg_coeff)
>
> ---
> The following create 4 (well 3) different columns. I may give you an idea
> how to proceed.
> Also, good programming practice is to use variables and not constants.
>
> nyrSpan   = 10
> nyrCrit   = 10
> nyrStrt1  = 1980
> nyrStrt2  = 2001
> nyrLast1  = nyrStrt1+nyrSpan-1
> nyrLast2  = 2010
>
> NTIM      = 1000    ; arbitrary max possible # elements
> strtYear  = new( NTIM, "integer")
> lastYear  = new( NTIM, "integer")
> trend     = new( NTIM, "float")
> rc        = new( NTIM, "float")
>
> nt        = -1
> do nyrStrt=nyrStrt1,nyrStrt2
>    do nyrLast=nyrLast1,nyrLast2
>       nyrs = nyrLast-nyrStrt+1
>       if (nyrs.ge.nyrCrit) then
>           test_rc = regline_stats(tofloat(ispan(1,
> nyrSpan,1)),random_normal(-1,1,nyrSpan))
>           nt = nt+1
>           strtYear(nt) = nyrStrt
>           lastYear(nt) = nyrLast
>           spanYear     = nyrLast-nyrStrt+1
>           rc(nt)       = (/ test_rc /)   ; (/.../) no meta data ; same as
> b(1)
>          ;trend(nt)    = ?????
>           print(strtYear(nt)+"  "+lastYear(nt)+"  "+spanYear+"  "+rc(nt))
>        end if
>    end do
> end do
>
>  print("=================================================")
>  ntim = nt+1    ; # of elements
>  print("ntim="+ntim)
>
>
>
> On Mon, Jun 5, 2017 at 11:10 AM, Andreas Chrysanthou <eeac at leeds.ac.uk>
> wrote:
>
>> There was one not insignificant thing I didn’t mention.
>>
>> the regline_stats function for the b calculates  both the b(0) +b(1*)x of
>> the linear regression, while the b95 calculates both the 2.5% and 97.5%
>> regression coefficient confidence intervals.
>> So when it tries to save to that cell, there are two values for the @b
>> and @b95.
>>
>> That’s why I got the error of : "fatal:Dimension sizes on right hand side
>> of assignment do not match dimension sizes of left hand side"
>>
>> I only want the slope of the liner trend (b(1)) and my criterion if I
>> need to save these values is that the confidence intervals should not be
>> negative (that would probably need to be included in the if loop).
>> But I don’t know how to keep only one value of those pair of calculated
>> stats.
>>
>> Cheers,
>> Andreas
>>
>>
>> On 5 Jun 2017, at 17:17, Adam Phillips <asphilli at ucar.edu> wrote:
>>
>> Hi Andreas,
>> As there are singular values for reg_coef and trend_slope for each start
>> and end time, I think it would be best to simply create a 3D array
>> dimensioned (start_date, end_date,2), with the last dimension (0) =
>> trend_slope and (1) representing reg_coeff. If you *must* have a
>> 4-dimensional array then you should create an array that is dimensioned 22
>> x 22 x 2 x 2, but (:,:,1,0) and (:,:,0,1) will be missing. In the example
>> below I show how to create both types of arrays:
>>
>> finarr = new((/22,22,2/),typeof(value_test))
>> finarr!0 = "startyear"
>> finarr&startyear = ispan(1980,2001,1)
>> finarr!1 = "endyear"
>> finarr&endyear = ispan(1989,2010,1)
>> finarrZ = new((/22,22,2,2/),typeof(value_test))
>> finarrZ!0 = "startyear"
>> finarrZ&startyear = ispan(1980,2001,1)
>> finarrZ!1 = "endyear"
>> finarrZ&endyear = ispan(1989,2010,1)
>>
>> do i=1980,2001,1
>>    do j=1989,2010,1
>>         ntimes=ispan(i,j,1)
>>         if (j-i .ge. 9 ) then
>>            test_rc=regline_stats(ntimes,value_test({i:j}))
>>            print(test_rc)
>>            start_date=i
>>            end_date=j
>>            finarr({i},{j},0) = test_rc at b*10  ; prints slope of the
>> linear trend for the selected range of years
>>            finarr({i},{j},1) = test_rc at b95         ; prints 2.5% and
>> 97.5% regression coefficient confidence intervals
>>            finarrZ({i},{j},0,0) = test_rc at b*10
>>            finarrZ({i},{j},1,1) =  test_rc at b95
>>        else
>>            print(“this age range has not been selected, since its less
>> than 9 years")
>>        end if
>>        delete(ntimes)
>>    end do
>> end do
>>
>> Hope that helps. If you have any further questions please respond to the
>> ncl-talk email list.
>> Adam
>>
>>
>> On Mon, Jun 5, 2017 at 9:48 AM, Andreas Chrysanthou <eeac at leeds.ac.uk>
>> wrote:
>>
>>> Hi NCL users,
>>>
>>>
>>> I created a loop for calculating a linear trend sensitivity for
>>> different start and end dates.
>>>
>>> My timeseries span over 1980-2010 and I want to calculate the linear
>>> trend of the timeseries for when the start - end date are more than >=
>>> 9years.
>>>
>>> (1980-1989, 1980-1990, 1980-1991,..., 1980-2010
>>>
>>> 1981-1990, 1981-1991, ..., 1981-2010
>>>
>>> ...
>>>
>>> ...
>>>
>>> ...
>>>
>>> 2000-2009, 2001-2010
>>>
>>> 2001-2010)
>>>
>>>
>>> I’ve created the loops that calculate those values but I need to save
>>> them in an array as 4 different columns (start_date,
>>> end_date,trend_slope,reg_coeff)
>>> My aim is to plot those as a a contour box plot with x axis the start
>>> date and y axis the end date, and the calculated (i’m gonna filter out
>>> those values with some criteria) trend values based on a colormap.
>>>
>>> Can you help me in order to save the values to that new array so I can
>>> plot it?
>>>
>>> A snippet of the code follows:
>>>
>>> do i=1980,2001,1
>>>    do j=1989,2010,1
>>>         ntimes=ispan(i,j,1)
>>> if (j-i .ge. 9 ) then
>>>         test_rc=regline_stats(ntimes,value_test({i:j}))
>>>         print(test_rc)
>>>         start_date=i
>>>         end_date=j
>>>         trend_slope=test_rc at b*10  ; prints slope of the linear trend
>>> for the selected range of years
>>>         reg_coeff=test_rc at b95         ; prints 2.5% and 97.5%
>>> regression coefficient confidence intervals
>>> else print(“this age range has not been selected, since its less than 9
>>> years")
>>>     end if
>>>       delete(ntimes)
>>> end do
>>> end do
>>>
>>> Cheers,
>>> Andreas
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> Andreas
>>>
>>>
>>>
>>> _______________________________________________
>>> ncl-talk mailing list
>>> ncl-talk at ucar.edu
>>> List instructions, subscriber options, unsubscribe:
>>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>>
>>>
>>
>>
>> --
>> Adam Phillips
>> Associate Scientist,  Climate and Global Dynamics Laboratory, NCAR
>> www.cgd.ucar.edu/staff/asphilli/   303-497-1726 <(303)%20497-1726>
>>
>> <http://www.cgd.ucar.edu/staff/asphilli>
>>
>>
>>
>> _______________________________________________
>> ncl-talk mailing list
>> ncl-talk at ucar.edu
>> List instructions, subscriber options, unsubscribe:
>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>
>>
>
>
>
> _______________________________________________
> ncl-talk mailing list
> ncl-talk at ucar.edu
> List instructions, subscriber options, unsubscribe:
> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>
>


-- 
Adam Phillips
Associate Scientist,  Climate and Global Dynamics Laboratory, NCAR
www.cgd.ucar.edu/staff/asphilli/   303-497-1726

<http://www.cgd.ucar.edu/staff/asphilli>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20170607/8eca5ba1/attachment.html 


More information about the ncl-talk mailing list