library(shiny) library(pwr) library(ggplot2) library(latex2exp) ui <- fluidPage( titlePanel("Tính cỡ mẫu cho kiểm định t-test một mẫu"), sidebarLayout( sidebarPanel( numericInput("delta", "Hiệu ứng (mean difference):", value = 0.5, step = 0.1), numericInput("sd", "Độ lệch chuẩn (standard deviation):", value = 1, step = 0.1), numericInput("sig.level", "Mức ý nghĩa (alpha):", value = 0.05, min = 0.001, max = 0.1, step = 0.01), numericInput("power", "Độ mạnh kiểm định mong muốn (power):", value = 0.8, min = 0.5, max = 0.99, step = 0.01) ), mainPanel( h4("Công thức tính cỡ mẫu (LaTeX):"), uiOutput("latexFormula"), h4("Kết quả tính cỡ mẫu:"), verbatimTextOutput("sampleSize"), h4("Biểu đồ: Power vs. Sample Size"), plotOutput("powerPlot") ) ) ) server <- function(input, output) { output$sampleSize <- renderPrint({ result <- pwr.t.test(d = input$delta / input$sd, sig.level = input$sig.level, power = input$power, type = "one.sample", alternative = "two.sided") result$n }) output$latexFormula <- renderUI({ withMathJax( helpText('$$n = \\left( \\frac{(z_{1-\\alpha/2} + z_{power}) \\cdot \\sigma}{\\delta} \\right)^2$$') ) }) output$powerPlot <- renderPlot({ sample_sizes <- seq(5, 100, by = 1) powers <- sapply(sample_sizes, function(n) { pwr.t.test(n = n, d = input$delta / input$sd, sig.level = input$sig.level, type = "one.sample", alternative = "two.sided")$power }) df <- data.frame(SampleSize = sample_sizes, Power = powers) ggplot(df, aes(x = SampleSize, y = Power)) + geom_line(color = "blue", size = 1) + geom_hline(yintercept = input$power, linetype = "dashed", color = "red") + labs(title = "Quan hệ giữa Power và Cỡ mẫu", x = "Cỡ mẫu", y = "Power") + theme_minimal() }) } shinyApp(ui = ui, server = server)