【问题标题】:for loop adding the variable name to a formulafor循环将变量名称添加到公式
【发布时间】:2013-08-21 14:38:15
【问题描述】:

我正在尝试在 R 中执行随机森林回归,并且遇到了几个问题,并且我自己已经解决了其中的大部分问题,但是我无法解决最后一个问题。 我有一个我想读入的文件列表,这没问题(我使用 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]

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

提前致谢,

Jcrow

【问题讨论】:

  • 什么是目标?这些是所有数据中的相同列吗?
  • 目标是在读取的每个文件中定义的列。它似乎读取了列名,但如果我想自动化该过程,我需要读取每个文件并拥有列名与该文件关联
  • 据我了解,您正在阅读每个文件,并且在每个文件中您使用的是目标的第一个元素,然后是目标的第二个元素,然后是目标的第三个元素,对吗?我下面的代码适用于每个文件和目标的第一个元素。如果你想为每个文件的每个元素,你可以很容易地修改下面的代码。但是,在我这样做之前,请让我知道这是否是您所关心的?
  • 你是正确的,因为我需要第一个文件和目标的第一个元素,然后我需要第二个文件和目标的第二个元素等,for循环可以这样做,但我的问题使用公式部分 (y ~.) 这会调用数据集第 1 列中标记为 ind==1 的数据(在上面的示例中),然后我需要针对除第 1 列之外的其余数据调用它,因为这将对自己建模。我知道我可以使用 y ~ .-V1 但是如果 V1 名称随着每个文件的变化而变化,我也需要让 V1 元素也发生变化。对不起,我对这个问题的假设令人困惑
  • 没问题。我正在尝试做as.formula,但我没有要测试的样本数据。您可以发布示例数据吗?

标签: r for-loop random-forest


【解决方案1】:

这里是使用 mtcars 数据分成两个数据集 data1 和 data2 的解决方案。 (这里没有Rfor 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 的不同元素重复回归。

【讨论】:

    猜你喜欢
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2013-04-28
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    相关资源
    最近更新 更多