构建RF时下标超出界限

时间:2012-10-15 16:52:52

标签: r random-forest

我正在尝试基于r。

中的随机森林构建分类器

重现此代码的代码:

    library(quantmod)
    library(randomForest)

    getSymbols('^GSPC', from="2002-01-01") 
    GSPC <- GSPC[,1:5] # remove adjusted close
    GSPC$wkret <- lag(GSPC$GSPC.Close,-5)/GSPC$GSPC.Close # build weekly future return
    GSPC$wkret <- GSPC$wkret * 100 -100 # build index

    cutoff <- floor(dim(GSPC)[1]/4) # select the row at 25%
    cutoffbreak <- sort(abs(as.data.frame(GSPC$wkret)[,1]),decreasing=T)[cutoff] # get the top 25% return in absolute terms
    y <- cut(GSPC$wkret, breaks=c('-100',-cutoffbreak,cutoffbreak ,'100'),labels=c('down','','up')) # build factors 
    randomForest(GSPC[1:100],y[1:100]) # select first 100 to exclude NA's, dimension problems.

这有效:

y[1:100]
[1]                                                                                      down      down down
 [22]                up   up        down      down                          up   up   up   up 
=== zip ===

> is.factor(y)
[1] TRUE

> x[1:100]
              open    high     low   close     volume
2002-01-02 1148.08 1154.67 1136.23 1154.67 1171000000
2002-01-03 1154.67 1165.27 1154.01 1165.27 1398900000
2002-01-04 1165.27 1176.55 1163.42 1172.51 1513000000
2002-01-07 1172.51 1176.97 1163.55 1164.89 1308300000
=== zip ===

> class(x)
[1] "xts" "zoo"

这有效(但当然没有意义):

lm(y[1:100] ~ .,data=x[1:100])

但是建立一个随机森林给出了:

> rf <- randomForest(y[1:100] ~ .,data=x[1:100])
Error in randomForest.default(m, y, ...) : subscript out of bounds

> traceback()
4: randomForest.default(m, y, ...)
3: randomForest(m, y, ...)
2: randomForest.formula(y[1:100] ~ ., data = x[1:100])
1: randomForest(y[1:100] ~ ., data = x[1:100])
谷歌搜索说这是一个维度问题,但无法弄清楚为什么/如何。

r版本:

  

R.version                  _
          平台i686-pc-linux-gnu
          arch i686
          os linux-gnu
          系统i686,linux-gnu
          状态
          专业2           未成年人15.1
          2012年           月06
          第22天           svn rev 59600
          语言R
          version.string R版本2.15.1(2012-06-22)           昵称烤棉花糖

库版本:

    randomForest version: "2.15.1"
    quantmod version: "2.15.1"

2 个答案:

答案 0 :(得分:2)

我创造了y时出了点问题。 添加此代码时,代码运行正常:

    y <- as.factor(as.numeric(y))

我不知道我的y值有什么问题,但我知道这只是在我提供完整代码时才可以重现。

    > randomForest(na.omit(GSPC),y[1:2713])
    Error in randomForest.default(na.omit(GSPC), y[1:2713]) : 
      subscript out of bounds
    > y <- as.factor(as.numeric(y))
    > randomForest(na.omit(GSPC),y[1:2713])

    Call:
     randomForest(x = na.omit(GSPC), y = y[1:2713]) 
                   Type of random forest: classification
                         Number of trees: 500
    No. of variables tried at each split: 2

            OOB estimate of  error rate: 0.07%
    Confusion matrix:
        1    2   3 class.error
    1 348    1   0 0.002865330
    2   0 2034   0 0.000000000
    3   0    1 329 0.003030303

答案 1 :(得分:1)

使用公式和数据参数调用randomForest很常见,但x[1:100]不是矩阵,而是矢量。我想你的意思是x[1:100,]

此外,数据参数应该是数据帧,而不是矩阵。我假设x是一个矩阵(而不是数据帧),因为x[1:100]否则会返回以下错误消息:

Error in `[.data.frame`(x, 100) : undefined columns selected

或者,根据评论的建议,您也可以运行

randomForest( x[ 1:100, ], y[ 1:100 ] )