tylermorganwall / skpr

Generates and evaluates D, I, A, Alias, E, T, G, and custom optimal designs. Supports generation and evaluation of mixture and split/split-split/N-split plot designs. Includes parametric and Monte Carlo power evaluation functions. Provides a framework to evaluate power using functions provided in other packages or written by the user.
https://tylermorganwall.github.io/skpr/
GNU General Public License v3.0
115 stars 15 forks source link

Bug in eval_design #53

Closed ugroempi closed 4 years ago

ugroempi commented 4 years ago

Hi Tyler,

plan is a data frame with only numeric variables. The code below throws an error:

> eval_design(plan, formula(~.), 0.01) Error in[.design(design, lapply(design, class) %in% c("character", : i has wrong length

This is due to the presetting of contrasts in function eval_design: for (x in names(design[lapply(design, class) %in% c("character", "factor")])) { if (!is.null(attr(design[[x]], "contrasts"))) { presetcontrasts[[x]] = attr(design[[x]], "contrasts") } }

Proposed fix: names(design)[...]) {, i.e. move ")".

Best, Ulrike

tylermorganwall commented 4 years ago

Hi Ulrike,

Thank you for the bug report! I am having trouble reproducing this on my end. Can you provide are more specific example for the plan data.frame that results in the error?

> install.packages("skpr")
package ‘skpr’ successfully unpacked and MD5 sums checked
> library(skpr)
> expand.grid(a=c(1,-1),b=c(1,-1),c=c(1,-1)) %>% eval_design(formula(~.), 0.01)
    parameter            type     power
1 (Intercept)    effect.power 0.2157059
2           a    effect.power 0.2157059
3           b    effect.power 0.2157059
4           c    effect.power 0.2157059
5 (Intercept) parameter.power 0.2157059
6           a parameter.power 0.2157059
7           b parameter.power 0.2157059
8           c parameter.power 0.2157059

I am not getting an error. Confirming the variables are all type numeric:

> expand.grid(a=c(1,-1),b=c(1,-1),c=c(1,-1)) %>% lapply(class)
$a
[1] "numeric"

$b
[1] "numeric"

$c
[1] "numeric"
ugroempi commented 4 years ago

Hi Tyler, sorry, my problem description was wrong: the design has numeric factors only but comes with a cube and star block captured in a single factor, i.e. the problem occurs for designs with only one non-numeric variable. I tried to reproduce it with an expand.grid example but failed. Thus, there must be something special about applying the code to a data.frame object produced with my package, which has class design (first) and class data.frame and comes with some attributes. Here is the entire code:

require(DoE.wrapper) require(skpr) plan <- ccd.design(4) str(plan) plan %>% lapply(class)

## produces the error plan[,-1] %>% eval_design(formula(~.), 0.01) ## because of current code line names(plan[lapply(plan, class) %in% c("character", "factor")]) ## would work names(plan)[lapply(plan, class) %in% c("character", "factor")] ## or names(plan[, lapply(plan, class) %in% c("character", "factor"), drop=FALSE])

tylermorganwall commented 4 years ago

Thank you for the clarification. This should be fixed in 0.63.1 (commit 2c30d4f8167f7ac7f93dfbdf93f83bb94264ba73).