66 lines
2.1 KiB
R
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) |