FreddyHernandez commited on
Commit
3e4571e
1 Parent(s): bf6d097

Upload 6 files

Browse files

Nuevos archivos

Files changed (6) hide show
  1. include.html +0 -0
  2. include.md +22 -0
  3. server.R +92 -0
  4. ui.R +103 -0
  5. var.test.R +146 -0
  6. var_data.txt +101 -0
include.html ADDED
The diff for this file is too large to render. See raw diff
 
include.md ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Prueba de hipótesis para la varianza
2
+
3
+ Sea $X_1, X_2, \ldots, X_n$ una muestra aleatoria proveniente de una población normal con varianza $\sigma^2$ y supóngase que se desea probar la hipótesis de que $\sigma^2$ es igual a un valor de referencia $\sigma^2_0$, es decir, la hipótesis nula a estudiar es $H_0: \sigma^2 = \sigma_0^2$. En este problema las sospechas sobre la varianza $\sigma^2$ se resumen por medio de la hipótesis alterna ($H_a$) en una de tres situaciones como se muestra a continuación:
4
+
5
+ - $H_a: \sigma^2 < \sigma_0^2$,
6
+ - $H_a: \sigma^2 \neq \sigma_0^2$,
7
+ - $H_a: \sigma^2 > \sigma_0^2$,
8
+
9
+ El estadístico para realizar la prueba es:
10
+
11
+ $$
12
+ X_0^2=\frac{(n-1) S^2}{\sigma_0^2},
13
+ $$
14
+
15
+ donde $S$ corresponde a la desviación estándar muestral. Bajo la suposición de que $H_0$ es verdadera, el estadístico $X_0^2$ tiene distribución $\chi^2$ con $n-1$ grados de libertad.
16
+
17
+ Si el valor calculado para el estadístico dado en la ecuación anterior se denota por $\chi_0^2$, entonces el valor-$P$ de la prueba se calcula de acuerdo a la hipótesis alterna $H_a$ así:
18
+
19
+ - Si $H_a: \sigma^2 < \sigma_0^2$ entonces valor-$P$=$P(\chi^2_{n-1} < \chi_0^2)$.
20
+ - Si $H_a: \sigma^2 \neq \sigma_0^2$ entonces valor-$P$=$2 \times \min \left\{ P(\chi^2_{n-1} < \chi_0^2),~ P(\chi^2_{n-1} > \chi_0^2) \right\}$.
21
+ - Si $H_a: \sigma^2 > \sigma_0^2$ entonces valor-$P$=$P(\chi^2_{n-1} > \chi_0^2)$.
22
+
server.R ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ library(shiny)
2
+ source('var.test.R')
3
+
4
+ shinyServer(function(input,output,session){
5
+
6
+ observe({
7
+ inFile <- input$file1
8
+ if(is.null(inFile))
9
+ dt <- read.table('var_data.txt', header=T, sep='\t')
10
+ else dt <- read.csv(inFile$datapath, header=input$header,
11
+ sep=input$sep)
12
+ updateSelectInput(session, "variable", choices=names(dt))
13
+ })
14
+
15
+ output$statistic <- renderTable({
16
+ inFile <- input$file1
17
+ if(is.null(inFile))
18
+ dt <- read.table('var_data.txt', header=T, sep='\t')
19
+ else dt <- read.csv(inFile$datapath, header=input$header,
20
+ sep=input$sep)
21
+ y <- na.omit(dt[, input$variable]) # Para sacar los NA de la variable
22
+ res <- data.frame(Min=min(y), Var=var(y),
23
+ Max=max(y), n=length(y))
24
+ colnames(res) <- c('Mínimo', 'Varianza', 'Máximo', 'Número obs')
25
+ res
26
+ }, align='c', bordered=TRUE)
27
+
28
+ output$appPlot <- renderPlot({
29
+ inFile <- input$file1
30
+ if(is.null(inFile))
31
+ dt <- read.table('var_data.txt', header=T, sep='\t')
32
+ else dt <- read.csv(inFile$datapath, header=input$header, sep=input$sep)
33
+ par(mfrow=c(1, 2), bg='gray98')
34
+ y <- na.omit(dt[, input$variable]) # Para sacar los NA de la variable
35
+ hist(y, col='deepskyblue3', freq=F, las=1,
36
+ xlab=as.character(input$variable),
37
+ main='Histograma y densidad', ylab='Densidad')
38
+ lines(density(y), lwd=4, col='firebrick3')
39
+ qqnorm(y, las=1, main='QQplot',
40
+ pch=19, col='deepskyblue3',
41
+ ylab=as.character(input$variable))
42
+ qqline(y)
43
+ ks <- ks.test(x=y, y=pnorm)
44
+ legend('topleft', bty='n', col='red', text.col='deepskyblue3',
45
+ legend=paste('Valor P=', round(ks$p.value,2)))
46
+ })
47
+
48
+ output$inputData <- renderTable({
49
+ inFile <- input$file1
50
+ if(is.null(inFile))
51
+ dt <- read.table('var_data.txt', header=T, sep='\t')
52
+ else dt <- read.csv(inFile$datapath, header=input$header,
53
+ sep=input$sep)
54
+ dt
55
+ })
56
+
57
+ output$resul1 <- renderText({
58
+ inFile <- input$file1
59
+ if(is.null(inFile))
60
+ dt <- read.table('var_data.txt', header=T, sep='\t')
61
+ else dt <- read.csv(inFile$datapath, header=input$header,
62
+ sep=input$sep)
63
+ y <- na.omit(dt[, input$variable]) # Para sacar los NA de la variable
64
+ ph <- var.test(x=y, alternative=input$h0,
65
+ null.value=input$sigma20,
66
+ conf.level=input$alfa)
67
+ paste0('El estadístico de prueba es ', round(ph$statistic, 2),
68
+ ' con un valor-P de ', round(ph$p.value, 4), '.')
69
+ })
70
+
71
+ output$resul2 <- renderText({
72
+ inFile <- input$file1
73
+ if(is.null(inFile))
74
+ dt <- read.table('var_data.txt', header=T, sep='\t')
75
+ else dt <- read.csv(inFile$datapath, header=input$header,
76
+ sep=input$sep)
77
+ y <- na.omit(dt[, input$variable]) # Para sacar los NA de la variable
78
+ ph <- var.test(x=y, alternative=input$h0,
79
+ null.value=input$sigma20,
80
+ conf.level=input$alfa)
81
+ intervalo <- paste("(", round(ph$conf.int[1], digits=4), ", ",
82
+ round(ph$conf.int[2], digits=4), ").", sep='')
83
+ paste0('El intervalo de confianza del ', 100*input$alfa,
84
+ '% para la varianza poblacional es ', intervalo)
85
+ })
86
+
87
+ output$miteoria <- renderUI({
88
+ HTML(markdown::markdownToHTML(knit(input='include.md', quiet=TRUE)))
89
+ })
90
+
91
+ })
92
+
ui.R ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ library(shiny)
2
+ library(markdown)
3
+
4
+ shinyUI(pageWithSidebar(
5
+ headerPanel(title=HTML("Prueba de hipótesis para la varianza
6
+ &sigma;<sup>2</sup>"),
7
+ windowTitle="PH varianza"),
8
+ sidebarPanel(
9
+ h5('Esta aplicación realiza la prueba de hipótesis para la
10
+ varianza de una variable cuantitativa con distribución normal.'),
11
+
12
+ h6('La aplicación usa una base de datos de ejemplo pero el usuario
13
+ puede cargar su propia base de datos.'),
14
+
15
+ fileInput(inputId='file1',
16
+ label='Use el siguiente botón para cargar su base de datos.',
17
+ accept = c(
18
+ 'text/csv',
19
+ 'text/comma-separated-values',
20
+ 'text/tab-separated-values',
21
+ 'text/plain',
22
+ '.csv',
23
+ '.tsv'
24
+ )),
25
+
26
+ checkboxInput(inputId='header',
27
+ label='¿Tiene encabezado la base de datos?',
28
+ value=TRUE),
29
+
30
+ selectInput(inputId="sep",
31
+ label = "¿Cuál es la separación de los datos?",
32
+ choices = list(Tab='\t', Comma=',',
33
+ Semicolon=';', 'Space'=' '),
34
+ selected = ';'),
35
+
36
+ selectInput(inputId="variable",
37
+ label="Elija la variable cuantitativa para realizar
38
+ la prueba de hipótesis.",
39
+ choices=""),
40
+
41
+ numericInput(inputId='sigma20',
42
+ label=HTML("Ingrese el valor de referencia
43
+ &sigma;<sup>2</sup><sub>0</sub>
44
+ para probar H<sub>0</sub>:
45
+ &sigma;<sup>2</sup> = &sigma;
46
+ <sup>2</sup><sub>0</sub>"),
47
+ value=20, min=0, step=0.1),
48
+
49
+ selectInput(inputId="h0",
50
+ label=HTML("Elija la hipótesis alternativa
51
+ < , &ne; o >"),
52
+ choices=list("Menor" = "less",
53
+ "Diferente" = "two.sided",
54
+ "Mayor" = "greater"),
55
+ selected = "two.sided"),
56
+
57
+ sliderInput(inputId='alfa',
58
+ label=HTML("Opcional: elija un nivel de confianza para
59
+ construir el intervalo de confianza para
60
+ la varianza &sigma;<sup>2</sup>"),
61
+ min=0.90, max=0.99,
62
+ value=0.95, step=0.01),
63
+
64
+ img(src="logo.png", height = 60, width = 120),
65
+ img(src="udea.png", height = 25, width = 70),
66
+ img(src="cua.png", height = 40, width = 110),
67
+ br(),
68
+ tags$a(href="https://srunal.github.io", "https://srunal.github.io")
69
+
70
+ ),
71
+
72
+ mainPanel(
73
+ tabsetPanel(type = "pills",
74
+
75
+ tabPanel(title="Resultados",
76
+ h5('A continuación el histograma, la densidad,
77
+ el QQplot
78
+ y valor-P de la prueba de normalidad
79
+ Kolmogorov-Smirnov para la muestra.'),
80
+ plotOutput("appPlot",
81
+ width='500px',
82
+ height='300px'),
83
+ h4("- Tabla de resumen con los estadísticos muestrales:"),
84
+ tableOutput('statistic'),
85
+
86
+ h4("- Resultados de la prueba de hipótesis:"),
87
+ textOutput("resul1"),
88
+
89
+ h4(HTML("- Intervalo de confianza para la varianza
90
+ &sigma;<sup>2</sup>:")),
91
+ textOutput("resul2")
92
+
93
+ ),
94
+
95
+ tabPanel("Datos", "A continuación los datos que está usando
96
+ la aplicación.",
97
+ uiOutput('inputData')),
98
+
99
+ tabPanel("Teoría", includeHTML("include.html"))
100
+ )
101
+ )
102
+
103
+ ))
var.test.R ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var.test <- function(x, alternative='two.sided',
2
+ null.value=1, conf.level=0.95) {
3
+ alpha <- 1 - conf.level
4
+ n <- length(x)
5
+
6
+ if (alternative == 'two.sided') {
7
+ alt <- 'not equal to'
8
+ quantiles <- c(qchisq(p=alpha/2, df=n-1, lower.tail=F),
9
+ qchisq(p=1-alpha/2, df=n-1, lower.tail=F))
10
+ conf.int <- (n-1) * var(x) / quantiles
11
+ statistic <- (n-1) * var(x) / null.value
12
+ p.value <- 2 * min(c(pchisq(statistic, n-1, lower.tail=F),
13
+ pchisq(statistic, n-1, lower.tail=T)))
14
+ }
15
+
16
+ if (alternative == 'less') {
17
+ alt <- 'less than'
18
+ quantiles <- c(qchisq(p=conf.level, df=n-1, lower.tail=F),
19
+ 0)
20
+ conf.int <- (n-1) * var(x) / quantiles
21
+ statistic <- (n-1) * var(x) / null.value
22
+ p.value <- pchisq(statistic, n-1)
23
+ }
24
+
25
+ if (alternative == 'greater') {
26
+ alt <- 'greater than'
27
+ quantiles <- c(0,
28
+ qchisq(p=conf.level, df=n-1, lower.tail=T))
29
+ conf.int <- (n-1) * var(x) / quantiles
30
+ statistic <- (n-1) * var(x) / null.value
31
+ p.value <- pchisq(statistic, n-1, lower.tail=F)
32
+ }
33
+
34
+ res <- list(conf.int=conf.int, statistic=statistic, df=n-1,
35
+ alternative=alternative,
36
+ alt=alt, null.value=null.value,
37
+ conf.level=conf.level,
38
+ data.name=deparse(substitute(x)),
39
+ p.value=p.value, sample.var=var(x))
40
+ class(res) <- "vartest"
41
+ res
42
+ }
43
+
44
+
45
+
46
+ var_test_one <- function(varx, nx, alternative, conf.level, null.value) {
47
+ alpha <- 1 - conf.level
48
+ # Alternative two.sided
49
+ if (alternative == 'two.sided') {
50
+ quantiles <- c(qchisq(p=alpha/2, df=nx-1, lower.tail=F),
51
+ qchisq(p=1-alpha/2, df=nx-1, lower.tail=F))
52
+ conf.int <- (nx-1) * varx / quantiles
53
+ statistic <- (nx-1) * varx / null.value
54
+ p.value <- 2 * min(c(pchisq(statistic, nx-1, lower.tail=F),
55
+ pchisq(statistic, nx-1, lower.tail=T)))
56
+ }
57
+ # Alternative less
58
+ if (alternative == 'less') {
59
+ quantiles <- c(qchisq(p=conf.level, df=nx-1, lower.tail=T),
60
+ 0)
61
+ conf.int <- (nx-1) * varx / quantiles
62
+ statistic <- (nx-1) * varx / null.value
63
+ p.value <- pchisq(statistic, nx-1)
64
+ }
65
+ # Alternative greater
66
+ if (alternative == 'greater') {
67
+ quantiles <- c(Inf,
68
+ qchisq(p=conf.level, df=nx-1, lower.tail=F))
69
+ conf.int <- (nx-1) * varx / quantiles
70
+ statistic <- (nx-1) * varx / null.value
71
+ p.value <- pchisq(statistic, nx-1, lower.tail=F)
72
+ }
73
+
74
+ # To ensure that the output values are in the correct form
75
+ names(statistic) <- 'X-squared'
76
+ parameter <- nx - 1
77
+ names(parameter) <- 'df'
78
+ attr(conf.int, 'conf.level') <- conf.level
79
+ estimate <- varx
80
+ names(estimate) <- 'variance of x'
81
+ method <- 'X-squared test for variance'
82
+ data.name <- paste('varx =', varx, 'and nx =', nx)
83
+
84
+ res <- list(statistic=statistic,
85
+ parameter=parameter,
86
+ p.value=p.value,
87
+ conf.int=conf.int,
88
+ estimate=estimate,
89
+ null.value=null.value,
90
+ alternative=alternative,
91
+ method=method,
92
+ data.name=data.name)
93
+ return(res)
94
+ }
95
+
96
+ var_test_two <- function(varx, nx, vary, ny,
97
+ alternative, conf.level, null.value) {
98
+ alpha <- 1 - conf.level
99
+ # Alternative two.sided
100
+ if (alternative == 'two.sided') {
101
+ quantiles <- c(qf(p=alpha/2, df1=nx-1, df2=ny-1, lower.tail=F),
102
+ qf(p=1-alpha/2, df1=nx-1, df2=ny-1, lower.tail=F))
103
+ conf.int <- (varx / vary) / quantiles
104
+ statistic <- (varx / vary) / null.value
105
+ p.value <- 2 * min(c(pf(statistic, nx-1, ny-1, lower.tail=F),
106
+ pf(statistic, nx-1, ny-1, lower.tail=T)))
107
+ }
108
+ # Alternative less
109
+ if (alternative == 'less') {
110
+ quantiles <- c(Inf,
111
+ qf(p=conf.level, df1=nx-1, df2=ny-1, lower.tail=F))
112
+ conf.int <- (varx / vary) / quantiles
113
+ statistic <- (varx / vary) / null.value
114
+ p.value <- pf(q=statistic, df1=nx-1, df2=ny-1, lower.tail=T)
115
+ }
116
+ # Alternative greater
117
+ if (alternative == 'greater') {
118
+ quantiles <- c(qf(p=conf.level, df1=nx-1, df2=ny-1, lower.tail=T),
119
+ 0)
120
+ conf.int <- (varx / vary) / quantiles
121
+ statistic <- (varx / vary) / null.value
122
+ p.value <- pf(q=statistic, df1=nx-1, df2=ny-1, lower.tail=F)
123
+ }
124
+
125
+ # To ensure that the output values are in the correct form
126
+ names(statistic) <- 'F'
127
+ parameter <- c(nx-1, ny-1)
128
+ names(parameter) <- c('num df', 'denom df')
129
+ attr(conf.int, 'conf.level') <- conf.level
130
+ estimate <- varx / vary
131
+ names(estimate) <- 'ratio of variances'
132
+ method <- 'F test to compare two variances'
133
+ data.name <- paste('varx =', varx, ', nx =', nx,
134
+ ', vary =', vary, 'and ny =', ny)
135
+
136
+ res <- list(statistic=statistic,
137
+ parameter=parameter,
138
+ p.value=p.value,
139
+ conf.int=conf.int,
140
+ estimate=estimate,
141
+ null.value=null.value,
142
+ alternative=alternative,
143
+ method=method,
144
+ data.name=data.name)
145
+ return(res)
146
+ }
var_data.txt ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Weigth Heigth
2
+ 53.09817 168.9792
3
+ 60.2536 154.0794
4
+ 60.57112 178.5135
5
+ 53.55212 145.6071
6
+ 63.95424 145.1823
7
+ 68.62175 146.6526
8
+ 59.3937 150.1703
9
+ 54.85139 154.1393
10
+ 56.18212 211.1142
11
+ 57.94596 155.6074
12
+ 60.05633 180.7278
13
+ 56.65037 153.8238
14
+ 59.14473 160.6151
15
+ 60.85186 172.8011
16
+ 63.4691 168.2495
17
+ 68.87719 190.7063
18
+ 53.22856 193.0385
19
+ 61.98031 152.1141
20
+ 61.3466 178.4211
21
+ 70.6553 162.0479
22
+ 53.94735 138.9784
23
+ 65.30227 178.686
24
+ 67.90827 177.2521
25
+ 60.19456 182.7935
26
+ 63.14799 168.6113
27
+ 50.74211 161.106
28
+ 54.37209 149.4436
29
+ 61.80647 162.5439
30
+ 66.44006 204.6559
31
+ 69.32612 180.8448
32
+ 56.43465 166.6911
33
+ 59.92681 162.9765
34
+ 67.89035 159.6578
35
+ 50.20544 162.7743
36
+ 65.17708 162.8984
37
+ 64.21323 189.4598
38
+ 60.07455 150.462
39
+ 57.61265 148.8138
40
+ 66.2314 176.9834
41
+ 53.15213 182.6959
42
+ 56.11033 161.2404
43
+ 55.2948 190.1691
44
+ 60.50972 169.5429
45
+ 63.83561 148.3607
46
+ 65.33804 164.7481
47
+ 54.50226 167.4611
48
+ 65.59086 174.1593
49
+ 55.52423 167.5852
50
+ 67.02337 175.3402
51
+ 62.62035 170.9605
52
+ 68.87993 170.869
53
+ 53.89413 169.9824
54
+ 54.96583 172.2888
55
+ 52.12436 188.0458
56
+ 50.40455 196.4013
57
+ 62.84082 165.8279
58
+ 56.22349 155.3835
59
+ 57.65475 156.3143
60
+ 61.75107 175.7196
61
+ 60.88272 170.8627
62
+ 62.35261 170.2354
63
+ 60.57066 176.973
64
+ 63.32021 181.3175
65
+ 68.06532 184.0032
66
+ 62.78009 165.8424
67
+ 52.65252 182.4191
68
+ 66.70305 154.5413
69
+ 51.62308 145.1807
70
+ 56.02632 178.2507
71
+ 57.55016 155.53
72
+ 59.998 209.5686
73
+ 62.53957 140.5118
74
+ 61.46648 167.0732
75
+ 70.13264 166.7734
76
+ 60.09332 177.3142
77
+ 61.39649 158.3873
78
+ 60.20784 175.4754
79
+ 51.45882 153.2652
80
+ 49.993 163.1174
81
+ 61.18023 150.3906
82
+ 55.6152 161.9006
83
+ 61.40898 149.1997
84
+ 57.55849 180.9661
85
+ 55.819 178.2533
86
+ 59.39731 176.8483
87
+ 59.94743 150.9343
88
+ 56.59401 146.71
89
+ 68.53324 175.1023
90
+ 62.87226 173.1839
91
+ 65.50766 169.1627
92
+ 61.04492 168.7064
93
+ 62.38285 185.0806
94
+ 55.54364 162.3449
95
+ 53.17127 175.9443
96
+ 56.12465 162.7634
97
+ 63.39455 182.122
98
+ 61.88589 140.1003
99
+ 67.47816 154.0689
100
+ 60.24467 184.4114
101
+ 64.1793 171.2866