[R] qt with df<1 (repost)

Peter Dalgaard p.dalgaard at biostat.ku.dk
Thu Oct 16 10:20:01 CEST 2008


Prof Brian Ripley wrote:
> On Sun, 12 Oct 2008, Peter Dalgaard wrote:
> 
>> Prof Brian Ripley wrote:
>>> Please do RTFM, for the help says
>>>
>>>       df: degrees of freedom (> 0, maybe non-integer).  'df = Inf' is
>>>           allowed.  For 'qt' only values of at least one are currently
>>>           supported.
>>>
>>> On Sun, 12 Oct 2008, Enrico Rossi wrote:
>>>
>>>> Sorry about the html-formatted message. Here it is again in plain text.
>>>>
>>>> Hello,
>>>>
>>>> The function qt returns NaN for degrees of freedom <1. For example:
>>>>
>>>>> qt(0.5,0.5)
>>>> [1] NaN
>>>> Warning message:
>>>> In qt(p, df, lower.tail, log.p) : NaNs produced
>>>>
>>>> But qt(0.5,0.5) should be 0, since the distribution is symmetric.
>>>>
>>>>> pt(0,0.5)
>>>> [1] 0.5
>>>>
>>>> It actually fails with any value, as long as df<1.
>>>> Is this a bug, or is there some fundamental reason why this cannot be
>>>> computed?
>>>
>>> Neither ....
>> Well, presumably, it is using an algorithm that only works for df >=1. 
>> However, qf() works fine with df1 < 1, so there's a fairly easy 
>> workaround.
> 
> Are you referring to
> 
> If X ~ t(df) then X^2 ~ F(1, df)
> 
> ? That needs df2 < 1.  So the workaround is
> 
> fake_qt <- function(p, df)
>     sign(p-0.5) * sqrt(qf(2*min(p, 1-p), 1, df, lower=FALSE))

Yes, that's what I meant. For some reason I couldn't come up with the 
compact expression at the time.

(df1 was a typo, but not actually wrong since 1/F(1,df) ~ F(df,1)...)

> 
> Another workaround is qt(x, df, ncp=1e-10)
> 

Somewhat easier, yes!


-- 
    O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
   c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
  (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)              FAX: (+45) 35327907



More information about the R-help mailing list