[ncl-talk] Help in saving values in looping

Andreas Chrysanthou eeac at leeds.ac.uk
Wed Jun 7 13:16:09 MDT 2017


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<mailto: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<mailto: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<mailto: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<mailto: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<mailto: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<mailto: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/<http://www.cgd.ucar.edu/staff/asphilli/>   303-497-1726<tel:(303)%20497-1726>

<http://www.cgd.ucar.edu/staff/asphilli>


_______________________________________________
ncl-talk mailing list
ncl-talk at ucar.edu<mailto:ncl-talk at ucar.edu>
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk




-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20170607/f48de195/attachment.html 


More information about the ncl-talk mailing list