[R] Problem with contour(): typo

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Tue Sep 29 11:57:09 CEST 2020


On 29/09/2020 5:37 a.m., Helmut Schütz wrote:
> Dear Duncan,
> 
> Duncan Murdoch wrote on 2020-09-28 21:47:
>> You're doing a lot of manipulation of the z matrix; I haven't followed
>> all of it, but that's where I'd look for problems.  Generally if you
>> keep your calculation of the z matrix very simple you are better off.
>> For example, once you have xs and ys in the form you want, calculate z as
>>
>> z <- outer(x,y, function(x,y) ...)
 >>
 >> and then plot it using contour(x, y, z, ...)

Sorry, that was a typo, should have been

   z <- outer(xs,ys, function(x,y) ...)
   contour(xs, ys, z)

>>
>> The only tricky issue here is that the function needs to be
>> vectorized, so if your power.TOST function doesn't accept vectors for
>> CV and theta0,
>> you'll need to put it in a wrapper that does (perhaps using the
>> Vectorize function).
> 
> Here I'm lost. power.TOST(theta0, CV, ...) vectorizes properly for
> theta0 _or_ CV but no _both_. Hence
> library(PowerTOST)
> power.TOST(theta0 = c(0.9, 0.95, 1), CV = 0.25, n = 28)
> and
> power.TOST(theta0 = 0.95, CV = c(0.2, 0.25, 0.3), n = 28)
> work, whereas
> power.TOST(theta0 = c(0.9, 0.95, 1), 0.95, CV = c(0.2, 0.25, 0.3), n = 28)
> not. Of note, we will throw an error in the next release if both
> arguments are vectors.

I wouldn't do that, because it doesn't fit the usual R style.  It's very 
common for functions to allow vector inputs in several arguments, and 
match up corresponding values to form a vector result.

> I tried
> f <- function(x, y) {
>     power.TOST(theta0 = x, CV = y, n = 28)
> }
> x <- unique(sort(c(0.95, seq(0.95*0.95, 1, length.out = 28))))
> y <- unique(sort(c(0.25, seq(0.25*0.8, 0.25*1.2, length.out = 28))))
> Vectorize(f, c("x, y"), SIMPLIFY = "array")
> which is obviously not correct.

If you want to use Vectorize, the command would be

   power.TOST.vectorized <- Vectorize(power.TOST, c("theta0", "CV"))

A roughly equivalent version (without the recycling that Vectorize does) 
would be

   power.TOST.vectorized <- function(theta0, CV, ...) {
     result <- length(theta0)
     for (i in seq_along(theta0))
       result[i] <- power.TOST(theta0[i], CV[i], ...)
     result
   }

Duncan Murdoch



More information about the R-help mailing list