2017-01-14 5 views
1

私はRコードを使って時系列の残差を予測しようとしています。サポートベクトルマシン - Rコード - 時系列の残差予測

# Load the data from the csv file 
dataDirectory <- "C://" 
data <- read.csv(paste(dataDirectory, "Data_SVM_Test.csv", sep=""),sep=";", header = TRUE) 
head(data) 
# Plot the data 
plot(data, pch=16) 

# Create a linear regression model 
model <- lm(Residuals ~ Observation, data) 

# Add the fitted line 
abline(model) 

predictedY <- predict(model, data) 

# display the predictions 
points(data$Observation, predictedY, col = "blue", pch=4) 

# This function will compute the RMSE 
rmse <- function(error) 
{ 
    sqrt(mean(error^2)) 
} 

error <- model$residuals # same as data$Y - predictedY 
predictionRMSE <- rmse(error) # 5.70377 

plot(data, pch=16) 

plot.new() 
# svr model ============================================== 
if(require(e1071)){ 
    model <- svm(Residuals ~ Observation , data) 

    predictedY <- predict(model, data) 

    points(data$Observation, predictedY, col = "red", pch=4) 

    # /!\ this time svrModel$residuals is not the same as data$Y - predictedY 
    # so we compute the error like this 
    error <- data$Residuals - predictedY 
    svrPredictionRMSE <- rmse(error) # 3.157061 
} 

I:私はRを使用してサポートベクトルマシンを構築しています予測のために

Observation Residuals 
1 -0,087527458 
2 -0,06907199 
3 -0,066604145 
4 -0,07796713 
5 -0,081723932 
6 -0,094046868 
7 -0,101535816 
8 -0,101884203 
9 -0,11131246 
10 -0,092548176 

:私のデータセットは、次の2つの列を(私は最初の10行でサンプルを入れます)持っています任意の出力せずに、私は次のエラーメッセージとを取得しています上記のコードを実行します。

Warning message: 
In Ops.factor(data$Residuals, predictedY) : ‘-’ not meaningful for factors 

誰もがこのエラーを解決する方法のアイデアを持っていますか?

多くの感謝!

答えて

0

分類にsvmを使用すると、出力はタイプファクタです。これは、ドキュメントからです:

Output of svm: A vector of predicted values (for classification: a vector of labels, for density estimation: a logical vector).

これは、次の例から見ることができます。

library(e1071) 
model <- svm(Species ~ ., data = iris) 
> str(predict(model, iris)) 
Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 
- attr(*, "names")= chr [1:150] "1" "2" "3" "4" ... 

それはあなたのデータについても同様です。コードpredictedY <- predict(model, data)のあなたのラインで

> predictedY <- predict(model, df) 
> predictedY 
      1   2   3   4   5   6   7   8   9   10 
-0,087527458 -0,06907199 -0,066604145 -0,07796713 -0,081723932 -0,094046868 -0,101535816 -0,101884203 -0,11131246 -0,092548176 
Levels: -0,066604145 -0,06907199 -0,07796713 -0,081723932 -0,087527458 -0,092548176 -0,094046868 -0,101535816 -0,101884203 -0,11131246 

predictedYは型因子である:レベルはPredictedYが要因であることを示しています。あなたは、因子(またはその逆)から数を控除しようとした場合、あなたはあなたのエラーを取得:

> 1:10 - as.factor(1:10) 
[1] NA NA NA NA NA NA NA NA NA NA 
Warning message: 
In Ops.factor(1:10, as.factor(1:10)) : ‘-’ not meaningful for factors 

あなたはそれを動作させるにしたい場合は、as.numericを使用して数値に要因を変換する必要があります。 1:10 - as.numeric(as.factor(1:10))

私はあなたのデータがどのように見えるかはわかりませんが、質問svmのタイトルから判断すると、おそらく時系列のための良い考えではありません。

+0

あなたの答えについて多くの感謝。だから、列の残差を数値に変換することをお勧めしますか?質問の初めに私のデータセットを入れました:) –

+0

svmで予測したときに 'predictY'がクラス係数になるので、' error < - data $ Residuals - as.numeric(predictedY) 'を使うことをお勧めします。 – LyzandeR

関連する問題