calculado manualmente

38

Sé que esto es bastante específico Rpregunta, pero puede estar pensando en proporción de varianza explicado, R2 , de forma incorrecta. Aquí va.

Estoy tratando de usar el Rpaquete randomForest. Tengo algunos datos de entrenamiento y datos de prueba. Cuando ajusto un modelo de bosque aleatorio, la randomForestfunción le permite ingresar nuevos datos de prueba para probar. Luego le indica el porcentaje de varianza explicado en estos nuevos datos. Cuando miro esto, obtengo un número.

Cuando uso la predict()función para predecir el valor de resultado de los datos de prueba en función del ajuste del modelo a partir de los datos de entrenamiento, y tomo el coeficiente de correlación al cuadrado entre estos valores y los valores de resultado reales para los datos de prueba, obtengo un número diferente. Estos valores no coinciden .

Aquí hay un Rcódigo para demostrar el problema.

# use the built in iris data
data(iris)

#load the randomForest library
library(randomForest)

# split the data into training and testing sets
index <- 1:nrow(iris)
trainindex <- sample(index, trunc(length(index)/2))
trainset <- iris[trainindex, ]
testset <- iris[-trainindex, ]

# fit a model to the training set (column 1, Sepal.Length, will be the outcome)
set.seed(42)
model <- randomForest(x=trainset[ ,-1],y=trainset[ ,1])

# predict values for the testing set (the first column is the outcome, leave it out)
predicted <- predict(model, testset[ ,-1])

# what's the squared correlation coefficient between predicted and actual values?
cor(predicted, testset[, 1])^2

# now, refit the model using built-in x.test and y.test
set.seed(42)
randomForest(x=trainset[ ,-1], y=trainset[ ,1], xtest=testset[ ,-1], ytest=testset[ ,1])
Stephen Turner
fuente

Respuestas:

52

La razón por la cual los valores de no coinciden es porque se informa la variación explicada en lugar de la variación explicada. Creo que esto es un malentendido común acerca de R 2 que se perpetúa en los libros de texto. Incluso mencioné esto en otro hilo el otro día. Si desea un ejemplo, vea el libro de texto (por lo demás bastante bueno) Seber y Lee, Análisis de regresión lineal , 2do. ed.R2randomForestR2

R2

R2=1i(yiy^i)2i(yiy¯)2.

Es decir, calculamos el error cuadrático medio, lo dividimos por la varianza de las observaciones originales y luego lo restamos de uno. (Tenga en cuenta que si sus predicciones son realmente malas, este valor puede ser negativo).

y^iy¯yy^y^

RLR2=Corr(y,y^)2.
LRRLR2

La randomForestllamada está usando la primera definición, así que si lo haces

   > y <- testset[,1]
   > 1 - sum((y-predicted)^2)/sum((y-mean(y))^2)

Verás que las respuestas coinciden.

cardenal
fuente
1
R2
(+1) Respuesta muy elegante, de hecho.
chl
@mpiktas, @chl, intentaré ampliar esto un poco más tarde hoy. Básicamente, hay una conexión cercana (pero, tal vez, ligeramente oculta) con las pruebas de hipótesis en el fondo. Incluso en una configuración de regresión lineal, si el vector constante no está en el espacio de la columna de la matriz de diseño, la definición de "correlación" fallará.
cardenal
Si tiene una referencia que no sea el libro de texto de Seber / Lee (no accesible para mí), me encantaría ver una buena explicación de cómo la variación explicada (es decir, 1-SSerr / SStot) difiere del coeficiente de correlación al cuadrado, o la variación explicada. Gracias nuevamente por el consejo.
Stephen Turner
Si el valor R cuadrado es negativo de los resultados de regresión de la variable instrumental, ¿hay alguna forma de suprimir este valor negativo y traducirlo en un valor positivo por el bien de informar? Consulte este enlace por favor: stata.com/support/faqs/statistics/two-stage-least-squares
Eric