in

¿Por qué la suma de la rho individual de Spearman al cuadrado es menor que 1 en comparación con la r de Pearson en un ejemplo sintético?

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:

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

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):

ingrese la descripción de la imagen aquí

Preguntas

  1. ¿Mi modelado es correcto?
  2. ¿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?
  3. Si hay un sesgo, ¿se puede derivar analíticamente?
  4. 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.

0

¿Te ayudó la respuesta?

Subscribirse
Notificar por
guest
0 Comentarios
Inline Feedbacks
Ver todas las Respuestas

¿Cuál es la diferencia entre S4 S4a y S5 delitos de orden público?

Pregunta sobre Reglas de Cifras Significativas, Precisión e Incertidumbre