From wo||g@ng@v|echtb@uer @end|ng |rom m@@@tr|chtun|ver@|ty@n|  Fri Oct 11 15:51:36 2024
From: wo||g@ng@v|echtb@uer @end|ng |rom m@@@tr|chtun|ver@|ty@n| (Viechtbauer, Wolfgang (NP))
Date: Fri, 11 Oct 2024 13:51:36 +0000
Subject: [Rd] 
 Error message when calling t.test() and aov() with a factor
 variables
In-Reply-To: <26377.6015.100740.392260@hornik.net>
References: <AS8PR08MB91934F160E97429FAFEB78588B792@AS8PR08MB9193.eurprd08.prod.outlook.com>
 <26377.6015.100740.392260@hornik.net>
Message-ID: <AS8PR08MB9193F95F26D8FF82DFAC65108B792@AS8PR08MB9193.eurprd08.prod.outlook.com>

> -----Original Message-----
> From: Kurt Hornik <Kurt.Hornik at wu.ac.at>
> Sent: Friday, October 11, 2024 14:18
> To: Viechtbauer, Wolfgang (NP) <wolfgang.viechtbauer at maastrichtuniversity.nl>
> Cc: r-devel <r-devel at r-project.org>
> Subject: Re: [Rd] Error message when calling t.test() and aov() with a factor
> variables
>
> >>>>> Viechtbauer, Wolfgang (NP) writes:
>
> > Hi all,
> > Just noticed that the error that arises when calling t.test() with factors
> could be a bit clearer:
>
> >> t.test(factor(c(3,1,2,4,3,5,4,5)), factor(c(2,1,2,3,4,5)))
> > Error in var(x) : Calling var(x) on a factor x is defunct.
> >   Use something like 'all(duplicated(x)[-1L])' to test for a constant vector.
> > In addition: Warning message:
> > In mean.default(x) :
> >   argument is not numeric or logical: returning NA
>
> > Obviously, using factors as input is nonsense, but this might happen on
> accident and then the error message could be a bit more on point. Similar for
> aov():
>
> >> aov(factor(c(3,1,2,4,3,5,4,5)) ~ factor(c(2,1,2,2,2,1,2,1)))
> > Call:
> >    aov(formula = factor(c(3, 1, 2, 4, 3, 5, 4, 5)) ~ factor(c(2,
> >     1, 2, 2, 2, 1, 2, 1)))
> > Error in levels(x)[x] :
> >   only 0's may be mixed with negative subscripts
> > In addition: Warning messages:
> > 1: In model.response(mf, "numeric") :
> >   using type = "numeric" with a factor response will be ignored
> > 2: In Ops.factor(y, z$residuals) : '-' not meaningful for factors
>
> > Not a big deal and trying to catch all of the silly things users may
> > do is of course impossible, but for this one adding a check that the
> > (response) variable is actually numeric could be useful.
>
> Indeed.
>
> As always, the question is whether we want to give an error unless
> is.numeric, or ensure via as.numeric?

I would issue an error. Using as.numeric() could lead to totally nonsensical results, for example when:

as.numeric(factor(c("low","high","mid")))

> Best
> -k
>
> > Best,
> > Wolfgang



[Rd] Error message when calling t.test() and aov() with a factor variables
Viechtbauer, Wolfgang (NP