Files
Shiny--Code/samplesize/aa/app.R
admin 33e9543b15 Upload to Server
Uploading to server
2025-08-02 05:15:23 +07:00

66 lines
2.1 KiB
R

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)