随机森林错误显示NA不允许用于预测



我可以从你们那里得到一些帮助和建议,因为我正试图在货币数据的分类问题上运行随机森林,但我得到了这个弹出窗口显示NA不允许在预测器中。然而,我试图自己解决这个问题,但仍然没有解决。

library(priceR)
library(tidyverse)  
library(quantmod) 
library(dplyr) 

获取数据

a <- historical_exchange_rates("THB", to = "USD",start_date = "2010-01-01", end_date = "2021-12-31")

设置输入指示

a.avg10 <- rollapply(a[,2],10,mean)   
a.avg20 <- rollapply(a[,2],20,mean)   
a.std10 <- rollapply(a[,2],20,sd)   
a.std20 <- rollapply(a[,2],20,sd) 
a.rsi5 <- na.omit(RSI(a[,2],5,"SMA"))   
a.rsi14 <- na.omit(RSI(a[,2],14,"SMA"))  
a.macd12269 <- na.omit(MACD(a[,2],12,26,9,"SMA"))   
a.macd7205 <- na.omit(MACD(a[,2],7,20,5,"SMA"))   
a.bbands <- na.omit(BBands(a[,2],20,"SMA",2))

创建变量方向

a.direction <- a %>% mutate(direction = ifelse(one_THB_equivalent_to_x_USD - lag(one_THB_equivalent_to_x_USD, 10) <= 0, 0, 1))

结合变量
a.data <- cbind(a[1:4350,2],a.avg10[1:4350],a.avg20[1:4350],a.bbands[1:4350,1:4],a.std10[1:4350],a.std20[1:4350],a.rsi5[1:4350],a.rsi14[1:4350],a.macd12269[1:4350,1:2],a.macd7205[1:4350,1:2],a.direction[1:4350,3])

训练和测试

a.split <- sample(c(rep(0,0.7*nrow(a.data)),rep(1,0.3*nrow(a.data))))

构建样本内和样本外数据集

isa.data <- a.data[a.split == 0,]  
osa.data <- a.data[a.split == 1,]

样本内和样本外数据集标准化

ismea.data <- sapply(isa.data,mean,2) 
issta.data <- apply(isa.data,2,sd)   
isida.data <- matrix (1,dim(isa.data)[1],dim(isa.data)[2])  
osmea.data <- sapply(osa.data,mean,2)  
ossta.data <- apply(osa.data,2,sd)  
osida.data <- matrix (1,dim(osa.data)[1],dim(osa.data)[2])

规范化数据

norma.data <- (isa.data - t(ismea.data*t(isida.data)))/t(issta.data*t(isida.data))  
normosa.data <- (osa.data - t(osmea.data*t(osida.data)))/t(ossta.data*t(osida.data))

用可变方向替换最后一列

a.dm <- dim(isa.data)
norma.data[,a.dm[2]] <- a.direction[1:3045,3]   
normosa.data[,a.dm[2]] <- a.direction[3046:4350,3]

合并为数据帧

isnorma.data <- as.data.frame(norma.data)   
osnorma.data <- as.data.frame(normosa.data)   
colnames(isnorma.data) <- c("exchage rate", "avg10", "avg20", "down", "mavg", "up", "pctB", "std10", "std20", "rsi5", "rsi14", "macd12269", "signal12269", "macd7205", "signal7205", "Direction")   
colnames(osnorma.data) <- c("exchage rate", "avg10", "avg20", "down", "mavg", "up", "pctB", "std10", "std20", "rsi5", "rsi14", "macd12269", "signal12269", "macd7205", "signal7205", "Direction")

用随机森林建模

rfisnorma.data <- isnorma.data %>% select(-Direction)   
rfosnorma.data <- osnorma.data %>% select(-Direction)

用方向标记训练和测试数据

a.lagret <- (a[,2] - lag(a[,2],10))/ lag(a[,2],10)   
rfa.direction <- NULL   
rfa.direction[a.lagret > 0.02] <- "Up"   
rfa.direction[a.lagret < -0.02] <- "Down"  
rfa.direction[a.lagret < 0.02 & a.lagret > -0.02] <- "Nowhere"   
isdira.data <- rfa.direction[1:3045]  
osdira.data <-  rfa.direction[3046:4350]

将标记数据转换为随机森林只接受的因子

isdira.data <- na.omit(as.factor(isdira.data))   
osdira.data <- na.omit(as.factor(osdira.data))

使用输入参数建模数据

rfmodela.data <- randomForest(rfisnorma.data[11:3045,1:15], y=as.factor(isdira.data), xtest=rfosnorma.data, ytest=as.factor(osdira.data), ntree=500, importance=TRUE)

在这一步中,我得到了一个错误"NA不允许在预测器">

如果您将最后一行代码替换为下面显示的代码,则会在2840和2850之间丢失数据,它应该运行。您可以使用参数xtest=xtest[index,], ytest=y[index],但我不确定您是否想要它们,因为测试数据与训练数据相同。请检查文档,以确保您正在做正确的事情。

tempdata<-xtest<-rfisnorma.data[11:3045,1:15]
y<-as.factor(as.character(isdira.data))
index<-c(1:2840,2850:nrow(tempdata))
rfmodela.data <- randomForest(tempdata[index,], y=y[index], ntree=500, importance=TRUE)
summary(rfmodela.data)

相关内容

最新更新