varianza_pi <- function(muestras_df) {
a <- ncol(muestras_df)
# Suma total de cada columna
totales <- sapply(muestras_df, function(col) sum(col, na.rm = TRUE))
# Promedio de los totales
promedio_total <- mean(totales)
# Varianza pi
var_pi <- a * sum((totales - promedio_total)^2)
return(var_pi)
}Simulación Muestras sistemáticas
Muestreo Estadístico
Función de Varianza
\[ Var(\hat{t_\pi}) = a\sum_{\xi = 0}^{a} \left({t}_{m\xi} - \bar{{t}} \right)^2 \]
Función SCE
\[ \text{SCE} = \sum_{j=1}^{a} n_{\xi} \left( \bar{y}_{\xi} - \bar{y_U} \right)^2 \]
SCE <- function(muestras_df) {
YbarraU <- mean(as.matrix(muestras_df), na.rm = TRUE) # Media Global
# Inicializar SCE
SCE_total <- 0
# Recorrer cada columna (muestra sistemática)
for (j in seq_along(muestras_df)) {
muestra <- muestras_df[[j]]
n_j <- sum(!is.na(muestra)) # número de elementos válidos
Ybarra_j <- mean(muestra, na.rm = TRUE) # promedio de la columna
SCE_total <- SCE_total + n_j * (Ybarra_j - YbarraU)^2
}
return(SCE_total)
}Función muestra sistemática.
muestras_sist <- function(poblacion, a) {
N <- length(poblacion)
# Calcular tamaño base de cada columna
base_tam <- floor(N / a)
extras <- N %% a # Cuántas columnas deben tener una fila más
muestras <- vector("list", a)
idx <- 1 # índice actual en la población
for (j in 1:a) {
tam_j <- base_tam + ifelse(j <= extras, 1, 0) # tamaño de esta columna
muestras[[j]] <- poblacion[idx:(idx + tam_j - 1)]
idx <- idx + tam_j
}
# Convertir a data.frame rellenando con NA para igualar filas
max_len <- max(sapply(muestras, length))
muestras_df <- as.data.frame(lapply(muestras, function(x) {
length(x) <- max_len
return(x)
}))
colnames(muestras_df) <- paste0("Muestra_", 1:a)
return(muestras_df)
}Simulación
####a) Cuando n es múltiplo de N ####
set.seed(123)
N <- 1000 # Tamaño población
n <- 200 # Tamaño muestra
poblacion <- rnorm(N, mean = 10, sd = 3)CASO 1 cuando N es múltiplo de n
c <- N %% n
print(paste("Residuo c = ", c))[1] "Residuo c = 0"
a<-floor(N/n);a[1] 5
muestras <- muestras_sist(poblacion, a)Tabla 1: de la muestra sistemática
cuando N es multiplo de n
| Muestra_1 | Muestra_2 | Muestra_3 | Muestra_4 | Muestra_5 |
|---|---|---|---|---|
| 8.318573 | 16.596431 | 9.779332 | 13.222037 | 11.068850 |
| 9.309468 | 13.937239 | 6.494046 | 9.917959 | 8.025969 |
| 14.676125 | 9.204565 | 8.095755 | 9.900009 | 12.565607 |
| 10.211525 | 11.629582 | 9.913475 | 5.451797 | 13.458809 |
| 10.387863 | 8.756980 | 12.012088 | 12.371156 | 10.828824 |
| 15.145195 | 8.571259 | 5.048360 | 9.367797 | 10.432314 |
g<-SCE(muestras);g[1] 6.155054
varianza_pi(muestras)[1] 6155.054
Ahora vamos a verificar que cuando N es múltiplo de n se cumple que:
\[ Var(\hat{t_\pi})= SCE*N \]
g*N[1] 6155.054
CASO 2 cuando N es no es múltiplo de n
N <- 21 # Tamaño población
n <- 4 # Tamaño muestra
poblacion <- rnorm(N, mean = 10, sd = 3)c <- N %% n
print(paste("Residuo c = ", c))[1] "Residuo c = 1"
a<-floor(N/n);a[1] 5
muestras <- muestras_sist(poblacion, a)Tabla 2: de la muestra sistemática
cuando N es distinto de n
| Muestra_1 | Muestra_2 | Muestra_3 | Muestra_4 | Muestra_5 |
|---|---|---|---|---|
| 7.012604 | 13.12172 | 8.659122 | 11.407096 | 6.214299 |
| 6.880135 | 10.74918 | 18.392173 | 9.366259 | 10.856769 |
| 9.946059 | 17.24862 | 18.496678 | 10.561153 | 15.247742 |
| 9.603475 | 12.05559 | 6.343865 | 10.682628 | 9.507730 |
| 2.351972 | NA | NA | NA | NA |
g<-SCE(muestras);g[1] 110.665
varianza_pi(muestras)[1] 1090.134
Ahora vamos a verificar que cuando N no es múltiplo de n no se cumple que:
\[ Var(\hat{t_\pi})= SCE*N \]
g*N[1] 2323.965
Simulación mas general
n_que_cumplen <- function(N, tolerancia = 1e-8) {
# Generar población simulada
set.seed(123)
poblacion <- rnorm(N, mean = 10, sd = 3)
# Encontrar divisores de N
divisores <- which(N %% 1:(N - 1) == 0)
# Inicializar vector de resultados
cumplen <- c()
for (n in 2:(N - 1)) {
muestras <- muestras_sist(poblacion, n)
sce <- SCE(muestras)
varpi <- varianza_pi(muestras)
if (abs(sce * N - varpi) < tolerancia) {
cumplen <- c(cumplen, n)
}
}
# Imprimir resultados
cat("Los divisores de", N, "son:", divisores, "\n")
cat("Los valores de n que cumplen que SCE * N = varianza_pi son:", cumplen, "\n")
return(cumplen)
}set.seed(123)
n_que_cumplen(32)Los divisores de 32 son: 1 2 4 8 16
Los valores de n que cumplen que SCE * N = varianza_pi son: 2 4 8 16
[1] 2 4 8 16
CASO 3: variable auxiliar con N múltiplo de n
# Función que simula varianzas para un N dado (orden ASCENDENTE)
simular_varianzas <- function(N, n = 10) {
poblacion <- rnorm(N, mean = 10, sd = 3)
x_aux <- poblacion + rnorm(N, mean = 0, sd = 0.2) # Alta correlación (~0.98)
# Sin ordenar
muestras_no_ord <- muestras_sist(poblacion, n)
var_no <- varianza_pi(muestras_no_ord)
# Ordenando por la auxiliar (ASCENDENTE)
orden <- order(x_aux) # Cambio clave: orden ascendente
muestras_ord <- muestras_sist(poblacion[orden], n)
var_ord <- varianza_pi(muestras_ord)
return(c(no = var_no, ord = var_ord))
}
# Simular para distintos N
Ns <- seq(50, 1000, by = 50)
resultados <- sapply(Ns, simular_varianzas)
# Graficar
plot(Ns, resultados["no", ], type = "l", col = "red", lwd = 2,
ylim = range(resultados), ylab = "Varianza del estimador",
xlab = "Tamaño de la población (N)", main = "Varianza: orden ascendente vs sin ordenar")
lines(Ns, resultados["ord", ], col = "blue", lwd = 2)
legend("topright", legend = c("Ordenado", "Sin Ordenar"),
col = c("red", "blue"), lwd = 2)