[R] Odp: How to make t.test handle "NA" and "essentially constant values" ?
Tony Plate
tplate at acm.org
Tue Feb 12 22:59:37 CET 2008
Petr PIKAL wrote:
> Hi
>
> r-help-bounces at r-project.org napsal dne 12.02.2008 09:09:23:
>
>> Hi,
>>
>> First problem:
>>> test <- matrix(c(1,1,2,1), 2,2)
>>> apply(test, 1, function(x) { t.test(x) $p.value })
>> Error in t.test.default(x) : data are essentially constant
>
> make your data not constant
>
>> Second problem:
>>> test <- matrix(c(1,0,NA,1), 2,2)
>>> apply(test, 1, function(x) { t.test(x) $p.value })
>> Error in t.test.default(x) : not enough 'x' observations
>
> increase number of observations
>
>
>> How to make t-test ignores this errors ?
>
> Well, the procedure is complaining that you do not give it correct data.
> You shall be gratefull for a great software which prevent you from making
> silly things as try to compute t.test when data have zero variantion or
> number of observations is 1.
It's nice that the software recognizes situations in which a sensible
answer can't be computed. At that point, there are two possible actions:
(1) stop with an informative error, and (2) silently return NA. Option (1)
is wonderful for interactive use, but option (2) is easier to handle in
programs where one is making many calls to the function as part of some
automated procedure (e.g., as part of a bootstrap procedure).
Speaking from personal experience, it can be quite a drag when one has set
up and mostly-debugged a long computation only to have it stop with an
error like "data are essentially constant" right near the end because of
some condition for which the function author thought it better to stop with
an error rather than return NA (or some other indication that there was no
sensible answer) (didn't happen with t.test, but I've experienced it with a
few other functions.)
So, I don't think it's at all unreasonable for the OP to request a way to
make t.test() return NA instead of stopping with an error.
Looking at the code for t.test, it doesn't look like there's any argument
to specify such behavior, so the options are to write one's own version of
t.test, or use try() as other posters have suggested. Here's an example
using try():
> my.t.test.p.value <- function(...) {
+ obj<-try(t.test(...), silent=TRUE)
+ if (is(obj, "try-error")) return(NA) else return(obj$p.value)
+ }
> my.t.test.p.value(numeric(0))
[1] NA
> my.t.test.p.value(1:10)
[1] 0.000278196
> my.t.test.p.value(1)
[1] NA
> my.t.test.p.value(c(1,1,1))
[1] NA
> my.t.test.p.value(c(1,2,NA))
[1] 0.2048328
> my.t.test.p.value(c(1,2))
[1] 0.2048328
>
hope this helps,
Tony Plate
>
> Regards
> Petr
>
>> [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
More information about the R-help
mailing list