2013-08-21 59 views
1

我试图在R中执行随机森林回归,并遇到了几个问题,并已修复其中的大部分问题,但我无法绕过这最后一个问题。 我有一个我希望阅读的文件列表,这是没有问题的(我使用for循环)。for循环将公式中的变量名添加到

library(randomForest) 
set.seed(51) 

file<- c("file1","file2","file3") 
targets<- c("X1.ts","ts2","ts3") 

for (i in 1:length(file)){ 
d_names<-paste("C:\\location\folder\",drugs[i],".txt",sep="") 
dataset<- read.table(d_names, header=TRUE, row.names=1) 
ind<-sample(2,nrow(dataset), replace=TRUE) 

#TRAINING DATASET1 PREDICTING DATASET2 
train_one.rf<- randomForest(dataset[ind==1,][[1]] ~ .-targets[i], data=dataset[ind==1,], prob=c(0.7,0.3)) 
dset2.pred<- predict(train_one.rf, newdata=dataset[ind==2,]) 

#TRAINING DATASET2 PREDICTING DATASET1 
train_two.rf<- randomForest(dataset[ind==2,][[1]] ~ .-targets[i], data=dataset[ind==2,], prob=c(0.7,0.3)) 
dset1.pred<- predict(train_two.rf, newdata=dataset[ind==1,]) 

} 

随机森林的本质是,我必须对数据进行建模,排除我希望预测的列。这样做,我必须使用:

dataset[ind==1,][[1]] ~ .-target[i] 

这是目标[I]我希望添加的名称列的(来自目标)的随机森林的每次运行。我曾尝试将它分配给一个变量,并且还将循环变量也作为子变量,但无济于事。我猜R中的公式部分需要一些比我更优雅的知识。

Thnaks提前,

Jcrow

+0

什么是目标?所有数据都是相同的列吗? – Metrics

+0

目标是在读入的每个文件中定义的一列。它似乎读取列名称,但是如果我想自动执行该过程,则需要读取每个文件并将列名称与该文件关联 – Jcrow06

+0

As far据我所知,你正在阅读每个文件,并在每个文件中使用目标的第一个元素,然后是目标的第二个元素,然后是目标的第三个元素,对吧?我下面的代码是针对每个文件和目标的第一个元素。如果你想为每个文件的每个元素,你可以很容易地修改下面的代码。但是,在我这样做之前,请让我知道这是你正在寻找的是什么? – Metrics

回答

1

下面是使用分成两个数据集作为data1和data2的所述mtcars数据的解决方案。 (当与R for loop这里)

data1<-mtcars[1:15,] 
data2<-mtcars[16:nrow(mtcars),] 
mydata<-list(data1,data2) 

targets<-list("mpg~.","cyl~.") 

Map(function(x) Map(function(y) randomForest(as.formula(y),data=x,importance=TRUE,proximity=TRUE), targets),mydata) 

[[1]] 
[[1]][[1]] 

Call: 
randomForest(formula = as.formula(y), data = x, importance = TRUE,  proximity = TRUE) 
       Type of random forest: regression 
        Number of trees: 500 
No. of variables tried at each split: 3 

      Mean of squared residuals: 4.637522 
        % Var explained: 63.98 

[[1]][[2]] 

Call: 
randomForest(formula = as.formula(y), data = x, importance = TRUE,  proximity = TRUE) 
       Type of random forest: regression 
        Number of trees: 500 
No. of variables tried at each split: 3 

      Mean of squared residuals: 0.2455641 
        % Var explained: 89.04 


[[2]] 
[[2]][[1]] 

Call: 
randomForest(formula = as.formula(y), data = x, importance = TRUE,  proximity = TRUE) 
       Type of random forest: regression 
        Number of trees: 500 
No. of variables tried at each split: 3 

      Mean of squared residuals: 10.90303 
        % Var explained: 78.93 

[[2]][[2]] 

Call: 
randomForest(formula = as.formula(y), data = x, importance = TRUE,  proximity = TRUE) 
       Type of random forest: regression 
        Number of trees: 500 
No. of variables tried at each split: 3 

      Mean of squared residuals: 0.1623937 
        % Var explained: 95.69 


Warning messages: 
1: In randomForest.default(m, y, ...) : 
    The response has five or fewer unique values. Are you sure you want to do regression? 
2: In randomForest.default(m, y, ...) : 
    The response has five or fewer unique values. Are you sure you want to do regression? 

:内Map功能重复对的目标不同元件的回归而外Map功能重复对MYDATA的不同元件的回归。