2013-04-18 71 views
0

這是一個具有挑戰性而又安靜有趣的衝突我有... 我希望我能真正做到這一點,希望有人能幫助我在這裏複雜的R - 函數/循環

這是「R」

這裏是我正在得到R平方爲X1從訓練

model=randomForest(X1~.,data=training,importance=TRUE,keep.forest=TRUE) 
predicted=predict(model,newdata=testing[,-1]) 
actual=testing$X1 
rsq=1-sum((actual-predicted)^2)/sum((actual-mean(actual))^2) 
print(rsq) 

下面代碼是訓練的頭,讓你知道它看起來的樣子

head(training) 
     X1  X2  X3   X4  X5   X6 
68 -3.556526 4.588409 -2.756521 -2.742035 11.542023 -18.405807 
23 -1.915947 -0.179710 -0.240580 -0.278259 -0.284058 0.553627 
129 -24.252174 -4.869564 4.800001 -14.608688 5.255074 -20.228981 
5 -1.637680 -1.147827 -2.005795 -1.121750 0.101440 -1.608688 
147 -68.289856 -0.626083 19.933334 -6.637680 15.379715 -11.515945 

有多達X77其中之一,其中的行數爲73

我的目標是使

model=randomForest(X1~.,data=training,importance=TRUE,keep.forest=TRUE) 
predicted=predict(model,newdata=testing[,-1]) 
actual=testing$X1 
rsq=1-sum((actual-predicted)^2)/sum((actual-mean(actual))^2) 
print(rsq) 

循環達到X77

所以到

model=randomForest(X77~.,data=training,importance=TRUE,keep.forest=TRUE) 
predicted=predict(model,newdata=testing[,-77]) 
actual=testing$X77 
rsq=1-sum((actual-predicted)^2)/sum((actual-mean(actual))^2) 
print(rsq) 

,所以我可以達到的77 R-sqared

我的最終目標就是把那些77 R平方


到Maxim.K和他人的意思

rsq=function(i){ 
model=randomForest(testing[,1]~.,data=training,importance=TRUE,keep.forest=TRUE) 
predicted=predict(model,newdata=testing[,-i]) 
actual=testing[,i] 
1-sum((actual-predicted)^2)/sum((actual-mean(actual))^2) 
} 

rsq=function(i){ 
model=randomForest(Xi~.,data=training,importance=TRUE,keep.forest=TRUE) 
predicted=predict(model,newdata=testing[,-i]) 
actual=testing[,i] 
1-sum((actual-predicted)^2)/sum((actual-mean(actual))^2) 
} 

我知道,第二個邏輯上是沒有意義的,但是那是什麼我需要。 因此,測試$ X1正在測試[,1],但它不會工作把測試[,1] 我必須把它放在一個「X1」的形式

我會怎麼做...?

+0

我沒有找到很好的制定問題。您應該指定已經嘗試過的內容,以及失敗的內容。否則,它只是要求免費的編程服務imo。無論如何,解決方案非常簡單,只需使用X.n作爲該函數的參數,即可引用您引用的代碼中的函數。然後使用* apply。 –

+0

請參閱編輯。我的代碼不起作用,這就是爲什麼我不分享,但沒關係。 – user2201675

回答

2

我覺得Maxim.K已經提到這個了,但像這樣的工作

rsq = function(i) { 
    n = colnames(testing)[i] 
    model=randomForest(as.formula(paste(n,"~.")),data=training,importance=TRUE,keep.forest=TRUE) 
    predicted=predict(model,newdata=testing[,-i]) 
    actual=testing[[n]] 
    1-sum((actual-predicted)^2)/sum((actual-mean(actual))^2) 
} 
sapply(1:77, rsq) 
+1

我不確定第3行是否正確。在原始示例中,它會有所不同,而在您的函數中,預測基於相同的數據(儘管在不同的模型上)發生。 –

+0

好點!我編輯了答案,這應該解決它。 – wannymahoots

+0

第三行應該是'as.formula(paste(n,「〜。」))'',除非'randomForest'的工作方式不同於通常的模型構建函數,比如'lm'。有關示例,請參閱http://stackoverflow.com/q/7666807/210673,以及許多鏈接的問題。 – Aaron