Comparing alpha of t, Welch, and conditional test

A conditional test (c), which decides between t and Welch test (w) by looking at the data first, does not keep its nominal alpha level.

show with app
  • app.R
library(shiny)

ui <- fluidPage(
  titlePanel("Comparing alpha of t, Welch, and conditional test"),
  p("A conditional test (c), which decides between t and Welch test (w) by
     looking at the data first, does not keep its nominal alpha level."
  ),
  sidebarPanel(
    sliderInput("m1", "Mean Group 1", -1, 1, 0, .1),
    sliderInput("m2", "Mean Group 2", -1, 1, 0, .1),
    sliderInput("n1", "Sample size Group 1", 1, 20,  6),
    sliderInput("n2", "Sample size Group 2", 1, 20, 12),
    radioButtons("alpha", "Alpha", c(".01", ".05", ".10"),
                 selected = ".05", inline = TRUE),
    radioButtons("nrep", "Number of replicates", c("500", "1000", "5000"),
                 selected = "1000", inline = TRUE),
    actionButton("simulate", "Simulate alpha")
  ),
  mainPanel(
    wellPanel(plotOutput("power"))
  )
)

server <- function(input, output){
  power <- eventReactive(input$simulate, {
    alpha <- as.numeric(input$alpha)
    sapply(seq(1, 3, .5), function(s) {
      pval <- replicate(input$nrep, {
        grp1 <- rnorm(input$n1, input$m1, s)
        grp2 <- rnorm(input$n2, input$m2, 1)
        c(
          t = t.test(grp1, grp2, var.equal = TRUE)$p.value,
          w = t.test(grp1, grp2, var.equal = FALSE)$p.value,
          c = t.test(grp1, grp2,
                     var.equal = var.test(grp1, grp2)$p.value >= alpha
                    )$p.value
        )
      })
      rowMeans(pval < alpha)
    })
  })


  output$power <- renderPlot({
    par(mai = c(.6, .6, .3, .1), mgp = c(2, .7, 0))
    matplot(seq(1, 3, .5), t(power()), type="b", pch=c("t", "w", "c"),
            xlab = expression(sigma[1]/sigma[2]), panel.first = grid(lty = 1),
            ylab = "Type I error rate (power)")
  })
}

shinyApp(ui, server)