Un conjunto de vectores aleatorios iid de igual tamaño se suman juntos por elementos:
$$\sum_{i=1}^{n}X_i=Y$$
Mi modelado sugiere que
$$E \izquierda[\sum_{i=1}^{n}\rho_{X_i,Y}^2\right]<1$$
mientras
$$E \izquierda[\sum_{i=1}^{n}r_{X_i,Y}^2\right]=1$$
Estas son las formas en que he visto el problema hasta ahora para cuando $X \sim \mathcal{N}(0, 1)$ pero lo siguiente también funciona para otras distribuciones comunes:
Número fijo de variables, tamaño de muestra fijo, función de correlación variada
Dadas solo 3 variables y un tamaño de muestra de 1000, las distribuciones de Spearman’s
$$\rho_{X_1,Y}^2+\rho_{X_2,Y}^2+\rho_{X_3,Y}^2$$
y de Pearson
$$r_{X_1,Y}^2+r_{X_2,Y}^2+r_{X_3,Y}^2$$
son como sigue:
Número fijo de variables, tamaño de muestra variado
Así es como la distribución de $\rho_{X_1,Y}^2+\rho_{X_2,Y}^2+\rho_{X_3,Y}^2$ parece para varios tamaños de muestra, lo que indica claramente algún sesgo persistente:
Tamaño de muestra fijo, número variado de variables
Cuando aumenta el número de variables, la media parece alejarse aún más de 1 (tamaño de muestra de 10000):
Preguntas
- ¿Mi modelado es correcto?
- ¿Existe un sesgo para la suma de $\rho^2$¿O está convergiendo a 1 con el aumento del tamaño de la muestra pero muy lentamente?
- Si hay un sesgo, ¿se puede derivar analíticamente?
- Si de hecho está convergiendo, ¿se puede aumentar la tasa de convergencia?
Aquí está mi código:
library(ggplot2)
library(dplyr)
library(purrr)
r_squared_sum <- function(num_vars, distrib_func, rsq_func, iterations=1000) {
R_sq_sums <- c()
for (i in 1:iterations) {
data <- c()
for (j in 1:num_vars) {
data <- append(data, list(distrib_func()))
}
Y = Reduce(`+`, data)
R_sq_sum = Reduce(`+`, lapply(data, partial(rsq_func, y=Y)))
R_sq_sums <- append(R_sq_sums, R_sq_sum)
}
return(data.frame(r_squared_sum=R_sq_sums))
}
# ---------------------------------------------
# Fixed number of variables, fixed sample size,
# varied correlation function, histogram
# ---------------------------------------------
data_spearman <- r_squared_sum(
num_vars=3,
distrib_func=partial(rnorm, 10000, 0, 1),
rsq_func=function (x, y) cor(x, y, method='spearman')^2
)
data_spearman$method <- 'spearman'
data_pearson <- r_squared_sum(
num_vars=3,
distrib_func=partial(rnorm, 10000, 0, 1),
rsq_func=function (x, y) cor(x, y, method='pearson')^2
)
data_pearson$method <- 'pearson'
ggplot(
bind_rows(data_pearson, data_spearman),
aes(x=r_squared_sum, fill=method, color=method)
) + geom_histogram(position="identity", alpha=0.8)
# -------------------------------------------------------
# Fixed number of variables, varied samlpe size, boxplots
# -------------------------------------------------------
sample_size_range <- c(1000, 10000, 100000, 1000000)
distrib_func_range <- lapply(
sample_size_range,
partial,
.f=partial(rnorm, mean=0, sd=1)
)
data_frames <- lapply(
distrib_func_range,
partial(
r_squared_sum,
num_vars=3,
rsq_func=function (x, y) cor(x, y, method='spearman')^2
)
)
for (i in 1:length(sample_size_range)) {
data_frames[[i]]$sample_size = as.character(sample_size_range[i])
}
ggplot(
bind_rows(data_frames),
aes(y=sample_size, x=r_squared_sum)
) + geom_boxplot()
# -------------------------------------------------------
# Fixed samlpe size, varied number of variables, boxplots
# -------------------------------------------------------
num_vars_range = 2:9
data_frames <- lapply(
num_vars_range,
partial(
r_squared_sum,
distrib_func=partial(rnorm, 10000, 0, 1),
rsq_func=function (x, y) cor(x, y, method='spearman')^2
)
)
for (i in 1:length(num_vars_range)) {
data_frames[[i]]$num_vars = as.character(num_vars_range[i])
}
ggplot(
bind_rows(data_frames),
aes(y=num_vars, x=r_squared_sum)
) + geom_boxplot()
Implementé un modelado similar en Python (mi idioma principal) con los mismos resultados.