3

lmR のコマンドを使用してプロットする 2 つのデータセットがあります。以下の最初のプロットは、赤い線の中央に配置されていません。しかし、右側の 2 番目のグラフは、線に向かって中央に配置されています。

データ1 データ2

私の質問は次のとおりです。

  1. データが線の中心にどれだけうまく配置されているかの尺度は何ですか?
  2. データ構造からそれを抽出する方法は?

そのデータをプロットするために使用するコードは次のとおりです。

 data <-read.table("myfile.txt")
 dat1x <- data$x1
 dat1y <- data$y1


 # plot left figure
 dat1_lm <- lm(dat1x ~ dat1y)
 plot(dat1x ~ dat1y)
 abline(coef(dat1_lm),col="red")
 dat1_lm.r2  <- summary(dat1_lm)$adj.r.squared;

 # repeat the the same for right figure
 dat2x <- data$x2
 dat2y <- data$y2
 dat2_lm <- lm(dat2x ~ dat2y)
 plot(dat2x ~ dat2y)
 abline(coef(dat2_lm),col="red")
 dat2_lm.r2  <- summary(dat2_lm)$adj.r.squared;

RMSE スコアでプロットを更新します。

F1g1 ここに画像の説明を入力

予測線を中心としたデータに基づいて、右の図が左の図よりも優れていることを示すスコアを探しています。

4

2 に答える 2

5

R-squared は、線の適合度、つまり線形モデルによって説明されるデータセットの変動のパーセンテージを示します。決定係数を説明するもう 1 つの方法は、モデルのパフォーマンスが平均モデルよりどれだけ優れているかということです。p 値は、適合の有意性を示します。つまり、ゼロと有意に異なる線形モデルの係数です。

これらの値を抽出するには:

dat = data.frame(a = runif(100), b = runif(100))
lm_obj = lm(a~b, dat)
rsq = summary(lm_obj)[["r.squared"]]
p_value = summary(lm_obj)[["coefficients"]]["b","Pr(>|t|)"]

または、観測値と線形モデルの結果の間の RMSE を計算することもできます。

rmse = sqrt(mean((dat$a - predict(lm_obj))^2))

aこれは線形モデルの RMSE であることに注意してください。aとの RMSE が必要な場合b:

rmse = sqrt(mean((dat$a - dat$b)^2))
于 2013-01-29T10:29:01.907 に答える
1

あなたが探しているのはMAPE(平均絶対パーセント誤差)です。精度の他の尺度 (MSE、MPE、RMSE、MAE など) に対する利点は、MAPE がレベルに依存せず、絶対誤差を測定し、明確な意味を持つことです。パッケージforecastを使用して、これらの測定値の一部を取得できます。

library(forecast)
data <- data.frame(y = rnorm(100), x = rnorm(100))
model <- lm(y ~ x, data)
accuracy(model)
#           ME         RMSE          MAE          MPE         MAPE 
# 5.455773e-18 1.019446e+00 7.957585e-01 1.198441e+02 1.205495e+02 
accuracy(model)["MAPE"]
#     MAPE 
# 120.5495 

また

mape <- function(f, x) mean(abs(1 - f / x) * 100)
mape(fitted(model), data$y)
# [1] 120.5495

一方、MPE (平均パーセンテージ エラー) は、p <- rep(2, 20)データが予測線の周りにどれだけ集中しているかを示すのに適しているように見えるかもしれません。y <- rep(c(3,1), 10)MPE = 0MAPE = 100%

したがって、実際に表示したいものを決定する必要があります。精度の尺度としては MAPE の方が優れていますが、2 番目の例では MPE の方が適している可能性があります。

更新:チェックしたいものを本当に中心に置いている場合は、二乗や絶対値などを含まない誤差を合計する測定値を確認する必要があります。つまり、ME (平均誤差) も確認することをお勧めします。 MPE よりも少し単純ですが、解釈が異なります。これは、あなたの最初のものにいくらか似た例です:

ここに画像の説明を入力

mpe <- function(f, x) mean((1 - f / x) * 100)
mape <- function(f, x) mean(abs(1 - f / x) * 100)
me <- function(f, x) mean(x - f)

set.seed(20130130)
y1 <- rnorm(1000, mean = 10, sd = 1.5) * (1:1000) / 300
y2 <- rnorm(1000, mean = 10, sd = 1.7) * (1:1000) / 250
pr <- (1:1000) / 30

data <- data.frame(y = c(y1, y2),
                   x = 1:1000,
                   prediction = rep(pr, 2),
                   id = rep(1:2, each = 1000))

results <- data.frame(MAPE = c(mape(pr, y1), mape(pr, y2)),
                      MPE = c(mpe(pr, y1), mpe(pr, y2)),
                      ME = c(me(pr, y1), me(pr, y2)),
                      id = 1:2)
results <- round(results, 2)

ggplot(data, aes(x, y)) + geom_line() + theme_bw() +
  facet_wrap(~ id) + geom_line(aes(y = prediction), colour = "red") +
  theme(strip.background = element_blank()) + labs(y = NULL, x = NULL) +
  geom_text(data = results, x = 150, y = 50, aes(label = paste("MAPE:", MAPE))) +
  geom_text(data = results, x = 150, y = 45, aes(label = paste("MPE:", MPE))) + 
  geom_text(data = results, x = 150, y = 40, aes(label = paste("ME:", ME)))
于 2013-01-29T13:49:05.200 に答える