[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