Manualmente calculado

38

Sei que essa é uma Rpergunta bastante específica , mas posso estar pensando na variação proporcional explicada, , incorretamente. Aqui vai.R2

Estou tentando usar o Rpacote randomForest. Eu tenho alguns dados de treinamento e dados de teste. Quando encaixo um modelo de floresta aleatório, a randomForestfunção permite inserir novos dados de teste para teste. Em seguida, informa a porcentagem de variação explicada nesses novos dados. Quando olho para isso, recebo um número.

Quando uso a predict()função para prever o valor do resultado dos dados de teste com base no ajuste do modelo a partir dos dados de treinamento e tomo o coeficiente de correlação ao quadrado entre esses valores e os valores de resultado reais dos dados de teste, recebo um número diferente. Esses valores não correspondem .

Aqui está um Rcódigo para demonstrar o 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
fonte

Respostas:

52

A razão pela qual os valores de não são correspondentes é porque está relatando variação explicada em oposição à variação explicada. Penso que este é um mal-entendido comum sobre que se perpetua nos livros didáticos. Eu até mencionei isso em outro tópico no outro dia. Se você quiser um exemplo, consulte o (se bem que bom) livro didático Seber and Lee, Linear Regression Analysis , 2nd. ed.R 2R2randomForestR2

Uma definição geral para é R 2 = 1 - Σ i ( y i - y i ) 2R2

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

Ou seja, calculamos o erro do quadrado médio, dividimos pela variação das observações originais e subtraímos isso de uma. (Observe que, se suas previsões forem muito ruins, esse valor poderá ser negativo.)

Agora, o que acontece com a regressão linear ( com um termo de interceptação! ) É que o valor médio do corresponde a . Além disso, o vetor residual é ortogonal ao vetor de valores ajustados . Quando você junta essas duas coisas, a definição se reduz àquela mais comumente encontrada, ou seja, (Eu usei os subscritos em para indicar regressão linear .) ˉ y y - y y R 2 L R =Corr(y, y )2. LRR 2 L Ry^iy¯yy^y^

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

A randomForestchamada está usando a primeira definição; portanto, se você fizer

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

você verá que as respostas correspondem.

cardeal
fonte
11
R2
(+1) Resposta muito elegante, de fato.
chl
@mpiktas, @chl, tentarei expandir isso um pouco mais tarde hoje. Basicamente, há uma conexão estreita (mas, talvez um pouco oculta) com o teste de hipóteses em segundo plano. Mesmo em uma configuração de regressão linear, se o vetor constante não estiver no espaço da coluna da matriz de design, a definição de "correlação" falhará.
cardeal
Se você tiver uma referência que não seja o livro didático de Seber / Lee (não acessível para mim), eu adoraria ver uma boa explicação de como a variação explicada (por exemplo, 1-SSerr / SStot) difere do coeficiente de correlação ao quadrado ou da variação explicada. Mais uma vez obrigado pela dica.
Stephen Turner
Se o valor do quadrado R for negativo a partir dos resultados da regressão da variável instrumental, existe uma maneira de suprimir esse valor negativo e traduzir em um valor positivo para fins de relatório? Consulte este link: stata.com/support/faqs/statistics/two-stage-least-squares
Eric