Solución:
Necesita un poco de conocimiento estadístico para ver esto. R al cuadrado entre dos vectores es solo el cuadrado de su correlación. Entonces puedes definir tu función como:
rsq <- function (x, y) cor(x, y) ^ 2
La respuesta de Sandipan le devolverá exactamente el mismo resultado (vea la siguiente prueba), pero tal como está, parece más legible (debido a la evidencia $r.squared
).
Hagamos las estadísticas
Básicamente ajustamos una regresión lineal de y
sobre x
y calcule la razón entre la suma de cuadrados de la regresión y la suma total de cuadrados.
lema 1: una regresión y ~ x
es equivalente a y - mean(y) ~ x - mean(x)
lema 2: beta = cov (x, y) / var (x)
lema 3: R.cuadrado = cor (x, y) ^ 2
Advertencia
R al cuadrado entre dos vectores arbitrarios x
y y
(de la misma longitud) es solo una medida de bondad de su relación lineal. ¡¡Pensar dos veces!! R al cuadrado entre x + a
y y + b
son idénticos para cualquier cambio constante a
y b
. Por tanto, es una medida débil o incluso inútil de la “bondad de la predicción”. Utilice MSE o RMSE en su lugar:
- ¿Cómo obtener RMSE a partir del resultado de la película?
- R – Calcular prueba MSE dado un modelo entrenado de un conjunto de entrenamiento y un conjunto de prueba
Estoy de acuerdo con el comentario de 42:
El R cuadrado se informa mediante funciones de resumen asociadas con funciones de regresión. Pero solo cuando dicha estimación esté estadísticamente justificada.
R cuadrado puede ser una medida (pero no la mejor) de “bondad de ajuste”. Pero no hay justificación de que pueda medir la bondad de la predicción fuera de muestra. Si divide sus datos en partes de entrenamiento y prueba y ajusta un modelo de regresión en el de entrenamiento, puede obtener un valor de R cuadrado válido en la parte de entrenamiento, pero no puede calcular legítimamente un R cuadrado en la parte de prueba. Algunas personas hicieron esto, pero no estoy de acuerdo.
Aquí hay un ejemplo muy extremo:
preds <- 1:4/4
actual <- 1:4
El R al cuadrado entre esos dos vectores es 1. Sí, por supuesto, uno es solo un cambio de escala lineal del otro, por lo que tienen una relación lineal perfecta. Pero, ¿de verdad crees que el preds
es una buena predicción sobre actual
??
En respuesta a las palabras para lo que sea
Gracias por tus comentarios 1, 2 y tu respuesta de detalles.
Probablemente no entendiste el procedimiento. Dados dos vectores x
y y
, primero ajustamos una línea de regresión y ~ x
luego calcule la suma de cuadrados de la regresión y la suma total de cuadrados. Parece que omite este paso de regresión y vaya directamente a la suma del cálculo cuadrado. Eso es falso, ya que la partición de suma de cuadrados no se cumple y no se puede calcular R cuadrado de manera consistente.
Como demostró, esta es solo una forma de calcular R cuadrado:
preds <- c(1, 2, 3)
actual <- c(2, 2, 4)
rss <- sum((preds - actual) ^ 2) ## residual sum of squares
tss <- sum((actual - mean(actual)) ^ 2) ## total sum of squares
rsq <- 1 - rss/tss
#[1] 0.25
Pero hay otro:
regss <- sum((preds - mean(preds)) ^ 2) ## regression sum of squares
regss / tss
#[1] 0.75
Además, su fórmula puede dar un valor negativo (el valor adecuado debe ser 1 como se mencionó anteriormente en el Advertencia sección).
preds <- 1:4 / 4
actual <- 1:4
rss <- sum((preds - actual) ^ 2) ## residual sum of squares
tss <- sum((actual - mean(actual)) ^ 2) ## total sum of squares
rsq <- 1 - rss/tss
#[1] -2.375
Comentario final
Nunca había esperado que esta respuesta pudiera eventualmente ser tan larga cuando publiqué mi respuesta inicial hace 2 años. Sin embargo, dadas las altas opiniones de este hilo, me siento obligado a agregar más detalles estadísticos y discusiones. No quiero engañar a la gente diciendo que solo porque pueden calcular una R al cuadrado con tanta facilidad, pueden usar R al cuadrado en todas partes.
Por qué no esto:
rsq <- function(x, y) summary(lm(y~x))$r.squared
rsq(obs, mod)
#[1] 0.8560185
No es algo obvio, pero el caret
el paquete tiene una función postResample()
que calculará “Un vector de estimaciones de rendimiento” según la documentación. Las “estimaciones de rendimiento” son
- RMSE
- R-cuadrado
- error absoluto medio (MAE)
y se tiene que acceder desde el vector como este
library(caret)
vect1 <- c(1, 2, 3)
vect2 <- c(3, 2, 2)
res <- caret::postResample(vect1, vect2)
rsq <- res[2]
Sin embargo, esto está utilizando la aproximación de correlación al cuadrado para r-cuadrado como se menciona en otra respuesta. No estoy seguro de por qué Max Kuhn no solo usó el 1-SSE / SST convencional.
caret
también tiene un R2()
método, aunque es difícil de encontrar en la documentación.
La forma de implementar la ecuación del coeficiente de determinación normal es:
preds <- c(1, 2, 3)
actual <- c(2, 2, 4)
rss <- sum((preds - actual) ^ 2)
tss <- sum((actual - mean(actual)) ^ 2)
rsq <- 1 - rss/tss
No está mal para codificar a mano, por supuesto, pero ¿por qué no hay una función para ello en un lenguaje creado principalmente para estadísticas? Estoy pensando que debo estar perdiendo la implementación de R ^ 2 en alguna parte, o a nadie le importa lo suficiente como para implementarlo. La mayoría de las implementaciones, como esta, parecen ser para modelos lineales generalizados.