[ncl-talk] Query about probability density functions
Dave Allured - NOAA Affiliate
dave.allured at noaa.gov
Fri Sep 13 09:42:06 MDT 2024
Giorgio, can you briefly explain what are the basic numerical differences
between the NCL and Python/IDL versions? Please explain mathematically,
not with code.
On Fri, Sep 13, 2024 at 9:25 AM Giorgio Graffino <g.graffino at tim.it> wrote:
> I've found a way to normalize the PDF and make it like Python and IDL.
>
> Here is the modified function for reference. I removed the call to the
> Fortran subroutine, so now the function it's a bit slower than the original
> version, and made all values float instead of double.
>
> undef("pdfx_norm")
> function pdfx_norm(x:numeric, nbin[1]:integer, opt:logical)
> local nGood, nbins, xMin, xMax, mnmxint, xSpace \
> ,bin, pdf, nTot, XMIN, XMAX, nLoOut, nHiOut
> begin
>
> if (nbin.le.2) then
> nbins = 25 ; default
> else
> nbins = nbin
> end if
>
> nGood = num(.not.ismissing(x))
> if (nGood.lt.3) then
> print("pdfx_norm: nGood="+nGood+" : Need more non-missing points")
> pdf = new( nbins, "double", getFillValue(x))
> return( pdf )
> end if
>
> XMIN = min(x)*1.
> XMAX = max(x)*1.
>
> xMin = 0.
> xMax = 0.
>
> if (opt .and. isatt(opt,"bin_min")) then
> xMin = opt at bin_min ; user set
> else
> xMin = XMIN ; calculate
> end if
>
> if (opt .and. isatt(opt,"bin_max")) then
> xMax = opt at bin_max ; user set
> else
> xMax = XMAX ; calculate
> end if
>
> if (opt .and. isatt(opt,"bin_nice")) then ; nice xMin, xMax
> outside = False
> if (isatt(opt,"bin_nice_outside")) then
> outside = opt at bin_nice_outside
> end if
> mnmxint = nice_mnmxintvl( XMIN, XMAX, nbins, outside)
> xMin = mnmxint(0)
> xMax = mnmxint(1)
> xSpace = mnmxint(2)
> ;;nbins = round( (xMax-xMin)/xSpace , 3)
> end if
>
> ;;dbin = (xMax-xMin)/(nbins-1) ; 5.2.0
> dbin = (xMax-xMin)/nbins
> binBound = xMin + ispan(0,nbins,1)*dbin
> binBound(nbins) = xMax ; avoid roundoff
>
> binCenter = (binBound(0:nbins-1) + binBound(1:nbins))*0.5
>
> binBoundMin = binBound(0)
> binBoundMax = binBound(nbins)
>
> pdf = new( nbins,typeof(x), getFillValue(x))
> pdf = 0.
>
> do nb=0,nbins-1
> pdf(nb) = num( x.ge.binBound(nb) .and. x.lt.binBound(nb+1) )
> if (nb.eq.(nbins-1)) then ; last bin
> pdf(nb) = pdf(nb) + num( x.eq.binBound(nb+1) ) ; include last bound
> end if
> end do
> ;;----
>
> pdf!0 = "x"
> pdf&x = binCenter
> ; max possible in data
> nMax = num(x.ge.XMIN .and. x.le.XMAX)
> ; actual number used
> nUse = num(x.ge.binBoundMin .and. x.le.binBoundMax)
>
> nLoOut = num(x.lt.binBoundMin) ; number outliers
> nHiOut = num(x.gt.binBoundMax)
>
> ; pdf = pdf/nMax*1.e2 ; original
> percent-frequency PDF
> pdf = pdf/sum(pdf)/dbin ; modified normalised PDF
>
> pdf at bin_center = binCenter
> pdf at bin_bounds = binBound
> pdf at bin_bound_min = binBoundMin
> pdf at bin_bound_max = binBoundMax
> pdf at bin_spacing = dbin ; binBound(2)-binBound(1)
> pdf at nbins = nbins
> pdf at nMax = nMax
> pdf at nUse = nUse
> if (nLoOut.gt.0 .or. nHiOut.gt.0) then
> pdf at nLoOut = nLoOut
> pdf at nHiOut = nHiOut
> end if
>
> pdf at long_name = "PDF"
> if (isatt(x,"long_name")) then
> pdf at long_name = "PDF: "+x at long_name
> end if
>
> return( pdf )
> end
>
>
> ------ Messaggio Originale ------
> Da: ncl-talk at mailman.ucar.edu
> A: dave.allured at noaa.gov Cc: ncl-talk at ucar.edu
> Inviato: mercoledì, settembre 11º 2024, 05:35 PM
> Oggetto: Re: [ncl-talk] Query about probability density functions
>
> Thanks Dave,
>
> The Fortran code looks straightforward. The last bit is for converting the
> pdf into frequency ("if flag is set", according to the comment), but the
> same code is also present in the contributed.ncl code. I'm assuming the
> flag isn't set, otherwise the conversion would be done twice.
>
> Unfortunately I'm not getting any closer to solve this problem. Simply
> dividing the NCL pdfs by 100 make them much smaller than Python or IDL
> pdfs. I don't know if anyone ever encountered this issue before.
>
> Cheers,
>
> Giorgio
>
>
> ------ Messaggio Originale ------
> Da: dave.allured at noaa.gov
> A: g.graffino at tim.it Cc: ncl-talk at ucar.edu
> Inviato: mercoledì, settembre 11º 2024, 04:58 PM
> Oggetto: Re: [ncl-talk] Query about probability density functions
> Giorgio, the fortran routine is at *ni/src/lib/nfpfort/xy1pdf77.f* in the
> NCL v6.6.2 source code.
>
>
> On Wed, Sep 11, 2024 at 8:01 AM Giorgio Graffino via ncl-talk <
> ncl-talk at mailman.ucar.edu> wrote:
>
>
>> Hi Dennis,
>>
>> Thank you for pointing out that detail.
>>
>> I've found the code of the pdfx function in here (
>> https://github.com/NCAR/ncl/blob/develop/ni/src/examples/gsun/contributed.ncl)
>> and the frequency is computed as pdf = 100d0*pdf/nMax. I tried to normalize
>> the pdf by multiplying the frequency pdf by the number of data and divide
>> by 100, but the results is very different depending on the number of data
>> to compute the pdf. Also, the results are different from similar
>> computations using Python, especially with large number of data. Without
>> knowing what the Fortran routine does (and I can't find it), I don't know
>> how to normalize NCL to match Python.
>>
>> Any suggestions?
>>
>> Cheers,
>>
>> Giorgio
>>
>>
>>
>> ------ Messaggio Originale ------
>> Da: shea at ucar.edu
>> A: g.graffino at tim.it Cc: ncl-talk at ucar.edu
>> Inviato: lunedì, settembre 9º 2024, 08:15 PM
>> Oggetto: Re: [ncl-talk] Query about probability density functions
>>
>> From the *pdfx*
>> <https://www.ncl.ucar.edu/Document/Functions/Contributed/pdfx.shtml>
>> documentation: "The PDF units are percent [%]."
>>
>> Divide by 100.
>>
>>
>>
>> On Mon, Sep 9, 2024 at 10:26 AM Giorgio Graffino via ncl-talk <
>> ncl-talk at mailman.ucar.edu> wrote:
>>
>>
>>> Hello NCL experts,
>>>
>>> I'm using pdfx to compute probability density functions (
>>> https://www.ncl.ucar.edu/Document/Functions/Contributed/pdfx.shtml). I
>>> noticed that the cumulative density functions sum up to 100 in NCL, instead
>>> of 1 as per definition. Why is that? How can I normalize them back to 1?
>>>
>>>
>>> Thanks for your help.
>>>
>>> Cheers,
>>>
>>> Giorgio
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.ucar.edu/pipermail/ncl-talk/attachments/20240913/6c2f2e92/attachment.htm>
More information about the ncl-talk
mailing list