我在 R 中使用 Predict.nnet() 的数据类型是否错误

发布于 2025-01-06 07:16:21 字数 4562 浏览 0 评论 0原文

我对 R 缺乏了解导致我的工作陷入停滞并寻求您的帮助。我希望根据一些时间序列数据构建一个神经网络,然后使用单独的数据和经过训练的神经网络返回的模型构建预测。

我创建了一个 xts,其中包含因变量 nxtCl(一日远期收盘股票价格)和自变量(一组相应的价格和技术指标)。

我将 xts 一分为二,一组是训练数据,另一组用于测试/预测,它们是 miData.trainmiData.test 分别。随后,我将这两个 xts 更改为缩放数据框。

miData.train <- scale(as.data.frame(miData.train))
miDate.test <- scale(as.data.frame(miData.test))

使用包 nnet 我能够根据训练数据构建神经网络:

nn <- nnet(nxtCl ~ .,data=miData.train,linout=T,size=10,decay=0.001,maxit=10000)

返回的公式对象的 str() 输出是:

> str(nn)
List of 18
$ n            : num [1:3] 11 10 1
$ nunits       : int 23
$ nconn        : num [1:24] 0 0 0 0 0 0 0 0 0 0 ...
$ conn         : num [1:131] 0 1 2 3 4 5 6 7 8 9 ...
$ nsunits      : num 22
$ decay        : num 0.001
$ entropy      : logi FALSE
$ softmax      : logi FALSE
$ censored     : logi FALSE
$ value        : num 4.64
$ wts          : num [1:131] 2.73 -1.64 1.1 2.41 1.36 ...
$ convergence  : int 0
$ fitted.values: num [1:901, 1] -0.465 -0.501 -0.46 -0.431 -0.485 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:901] "2005-07-15" "2005-07-18" "2005-07-19" "2005-07-20" ...
.. ..$ : NULL
$ residuals    : num [1:901, 1] -0.0265 0.0487 0.0326 -0.0384 0.0632 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:901] "2005-07-15" "2005-07-18" "2005-07-19" "2005-07-20" ...
.. ..$ : NULL
$ call         : language nnet.formula(formula = nxtCl ~ ., data = miData.train, inout = T,      size = 10, decay = 0.001, maxit = 10000)
$ terms        : language nxtCl ~ Op + Hi + Lo + Cl + vul + smaten + smafif + smath + vol + rsi + dvi
$ coefnames    : chr [1:11] "Op" "Hi" "Lo" "Cl" ...
$ xlevels      : Named list()
- attr(*, "class")= chr [1:2] "nnet.formula" "nnet"

然后我尝试运行预测使用此模型 nn 的函数和使用以下函数将数据分开的 miData.test

preds <- predict(object=nn, miData.test)

并且出现以下错误:

Error in terms.default(object, data = data) : 
  no terms component nor attribute

运行 terms.default > 在 miData.test 上我看到我的数据框确实没有任何属性:

terms.default(miData.test)
  Error in terms.default(miData.test) : no terms component nor attribute

但这就是预测无法运行的原因吗?

miData.test 的名称与 nn 的术语相匹配:

> nn$terms
nxtCl ~ Op + Hi + Lo + Cl + vul + smaten + smafif + smath + vol + 
rsi + dvi

> names(miData.test)[1] "Op"     "Hi"     "Lo"     "Cl"     "vul"    "smaten" "smafif" "smath"  "vol"    "rsi"    "dvi"    "nxtCl"

而且,就结构而言,数据与用于构建 nn 的数据完全相同 首先。我尝试将自己的命名属性添加到 miData.test 中,匹配 nn 的条款,但这不起作用。 miData.teststr() 返回:

> str(miData.test)
'data.frame':   400 obs. of  12 variables:
$ Op    : num  82.2 83.5 80.2 79.8 79.8 ...
$ Hi    : num  83.8 84.2 83 79.9 80.2 ...
$ Lo    : num  81 82.7 79.2 78.3 78 ...
$ Cl    : num  83.7 82.8 79.2 79 78.2 ...
$ vul   : num  4.69e+08 2.94e+08 4.79e+08 3.63e+08 3.17e+08 ...
$ smaten: num  84.1 84.1 83.8 83.3 82.8 ...
$ smafif: num  86.9 86.8 86.7 86.6 86.4 ...
$ smath : num  111 111 111 110 110 ...
$ vol   : num  0.335 0.341 0.401 0.402 0.382 ...
$ rsi   : num  45.7 43.6 36.6 36.3 34.7 ...
$ dvi   : num  0.00968 0.00306 -0.01575 -0.01189 -0.00623 ...
$ nxtCl : num  82.8 79.2 79 78.2 77.4 ...

任何使 predict() 在此实例中工作的帮助或见解将不胜感激。谢谢。


这是一些可重现的代码。将其放在一起时,我已经“删除”了错误。不幸的是,虽然它现在可以工作,但我对之前导致问题的原因一无所知:

    require(quantstrat)
    require(PerformanceAnalytics)
    require(nnet)
    initDate <- "2004-09-30"
    endDate <- "2010-09-30"
    symbols <- c("SPY")
    getSymbols(symbols, from=initDate, to=endDate, index.class=c("POSIXt","POSIXct"))
    rsi <- RSI(Cl(SPY))
    smaTen <- SMA(Cl(SPY))
    smaFif <- SMA(Cl(SPY),n=50)
    nxtCl <- lag(Cl(SPY),-1)
    tmp <- SPY[,-5]
    tmp <- tmp[,-5]
    miData <- merge(tmp,rsi,smaTen,smaFif,nxtCl)
    names(miData) <- c("Op","Hi","Lo","Cl","rsi","smaTen","smaFif","nxtCl")
    miData <- miData[50:1512]
    scaled.miData <- scale(miData)
    miData.train <- as.data.frame(scaled.miData[1:1000])
    miData.test <- as.data.frame(scaled.miData[1001:1463])
    nn <- nnet(nxtCl ~ .,data=miData.train,linout=T,size=10,decay=0.001,maxit=10000)
    preds <- predict(object=nn, miData.test)  

My lack of understanding of R is causing me to grind to a halt in my work and seek your help. I'm looking to build a neural network from some time series data and then build a prediction using separate data and the model returned by the trained neural network.

I created an xts containing the dependent variable nxtCl (a one-day forward closing stock price) and the independent variables (a set of corresponding prices and technical indicators).

I split the xts in two, one set being training data and the other set for testing/prediction, these are miData.train and miData.test respectively. Subsequently I altered these two xts to be scaled data frames.

miData.train <- scale(as.data.frame(miData.train))
miDate.test <- scale(as.data.frame(miData.test))

Using the package nnet I am able to build a neural network from the training data:

nn <- nnet(nxtCl ~ .,data=miData.train,linout=T,size=10,decay=0.001,maxit=10000)

The str() output for this returned formula object is:

> str(nn)
List of 18
$ n            : num [1:3] 11 10 1
$ nunits       : int 23
$ nconn        : num [1:24] 0 0 0 0 0 0 0 0 0 0 ...
$ conn         : num [1:131] 0 1 2 3 4 5 6 7 8 9 ...
$ nsunits      : num 22
$ decay        : num 0.001
$ entropy      : logi FALSE
$ softmax      : logi FALSE
$ censored     : logi FALSE
$ value        : num 4.64
$ wts          : num [1:131] 2.73 -1.64 1.1 2.41 1.36 ...
$ convergence  : int 0
$ fitted.values: num [1:901, 1] -0.465 -0.501 -0.46 -0.431 -0.485 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:901] "2005-07-15" "2005-07-18" "2005-07-19" "2005-07-20" ...
.. ..$ : NULL
$ residuals    : num [1:901, 1] -0.0265 0.0487 0.0326 -0.0384 0.0632 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:901] "2005-07-15" "2005-07-18" "2005-07-19" "2005-07-20" ...
.. ..$ : NULL
$ call         : language nnet.formula(formula = nxtCl ~ ., data = miData.train, inout = T,      size = 10, decay = 0.001, maxit = 10000)
$ terms        : language nxtCl ~ Op + Hi + Lo + Cl + vul + smaten + smafif + smath + vol + rsi + dvi
$ coefnames    : chr [1:11] "Op" "Hi" "Lo" "Cl" ...
$ xlevels      : Named list()
- attr(*, "class")= chr [1:2] "nnet.formula" "nnet"

I then try to run the prediction function using this model nn and the data I kept separate miData.test using the following function:

preds <- predict(object=nn, miData.test)

and I get the following error:

Error in terms.default(object, data = data) : 
  no terms component nor attribute

Running terms.default on miData.test I see that my data frame does not have any attributes:

terms.default(miData.test)
  Error in terms.default(miData.test) : no terms component nor attribute

but is this why the prediction will not run?

miData.test has names that match the terms of nn:

> nn$terms
nxtCl ~ Op + Hi + Lo + Cl + vul + smaten + smafif + smath + vol + 
rsi + dvi

> names(miData.test)[1] "Op"     "Hi"     "Lo"     "Cl"     "vul"    "smaten" "smafif" "smath"  "vol"    "rsi"    "dvi"    "nxtCl"

And, in terms of structure, the data is exactly the same as that which was used to build nn in the first place. I tried adding my own named attributes to miData.test, matching the terms of nn but that did not work. The str() of miData.test returns:

> str(miData.test)
'data.frame':   400 obs. of  12 variables:
$ Op    : num  82.2 83.5 80.2 79.8 79.8 ...
$ Hi    : num  83.8 84.2 83 79.9 80.2 ...
$ Lo    : num  81 82.7 79.2 78.3 78 ...
$ Cl    : num  83.7 82.8 79.2 79 78.2 ...
$ vul   : num  4.69e+08 2.94e+08 4.79e+08 3.63e+08 3.17e+08 ...
$ smaten: num  84.1 84.1 83.8 83.3 82.8 ...
$ smafif: num  86.9 86.8 86.7 86.6 86.4 ...
$ smath : num  111 111 111 110 110 ...
$ vol   : num  0.335 0.341 0.401 0.402 0.382 ...
$ rsi   : num  45.7 43.6 36.6 36.3 34.7 ...
$ dvi   : num  0.00968 0.00306 -0.01575 -0.01189 -0.00623 ...
$ nxtCl : num  82.8 79.2 79 78.2 77.4 ...

Any help or insight in getting predict() to work in this instance would be greatly appreciated. Thanks.


Here's some reproducible code. In putting this together, I have 'removed' the error. Unfortunately, although it now works, I am none the wiser as to what was causing the problem before:

    require(quantstrat)
    require(PerformanceAnalytics)
    require(nnet)
    initDate <- "2004-09-30"
    endDate <- "2010-09-30"
    symbols <- c("SPY")
    getSymbols(symbols, from=initDate, to=endDate, index.class=c("POSIXt","POSIXct"))
    rsi <- RSI(Cl(SPY))
    smaTen <- SMA(Cl(SPY))
    smaFif <- SMA(Cl(SPY),n=50)
    nxtCl <- lag(Cl(SPY),-1)
    tmp <- SPY[,-5]
    tmp <- tmp[,-5]
    miData <- merge(tmp,rsi,smaTen,smaFif,nxtCl)
    names(miData) <- c("Op","Hi","Lo","Cl","rsi","smaTen","smaFif","nxtCl")
    miData <- miData[50:1512]
    scaled.miData <- scale(miData)
    miData.train <- as.data.frame(scaled.miData[1:1000])
    miData.test <- as.data.frame(scaled.miData[1001:1463])
    nn <- nnet(nxtCl ~ .,data=miData.train,linout=T,size=10,decay=0.001,maxit=10000)
    preds <- predict(object=nn, miData.test)  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文