2

R での predict() 関数の使用に問題があり、助けが得られることを願っています。1) Y、2) X の 2 つの列を持つデータセットを考えてみましょう

私の目標は、自然なスプライン フィットを当てはめて 95% CI を取得し、95% CI の外側のポイントを外れ値としてマークすることです。これが私がすることです:

1) 最初は、データセット内のどの点も外れ値としてマークされていません。2) ns フィットを当てはめ、その 95% CI を使用して、CI の外側のポイントを外れ値としてマークします 3) 次に、最初にマークされた外れ値を除外し、別の ns を当てはめ、95% CI を使用して、外れ値をマークします.

* 問題: * 初期のデータセットに 1000 個の obs があるとします。最初のラウンドでいくつかの外れ値をマークすると、23 個の外れ値が得られます。次に、残りの 977 個の非外れ値を使用して、別の ns (fit.ns と呼びます) を当てはめます。次に、すべての X (すべて 1000) を使用して、この新しい適合に基づいて予測値を取得しますが、予測関数の newdata には 1000 の obs があるが、適合には 977 があるという警告とエラーが表示されます。返される予測値にも 977 の値があり、1000 ではありません。

* 私の predict() コード *

# Fitting a Natural Spline Fit (df = 3 by default)
fit.ns <- lm(data.ns$IBI ~ ns(data.ns$Time, knots = data.ns$Time[knots]))

# Getting Fitted Values and 95% CI:
fit.ns.values <- predict(fit.ns, newdata = data.frame(Time = data.temp$Time), 
interval="prediction", level = 1 - 0.05) # ??? PROBLEM

本当にありがとうございました。

データセットをアップロードできないようですが、私のコードは次のとおりです。

library(splines)
ns.knot <- 10
for (i in 1:2){
  # I exclude outliers so that my ns.fit does not get affected my outliers
  data.ns <- data.temp[data.temp$OutlierInd == 0,] 
  data.ns$BeatNum <- 1:nrow(data.ns) # BeatNum is like a row number for me and is an auxilary variable

  # Place Holder for Natural Spline results:
  data.temp$IBI.NSfit <- rep(NA, nrow(data.temp))
  data.temp$IBI.NSfit.L95 <- rep(NA, nrow(data.temp))
  data.temp$IBI.NSfit.U95 <- rep(NA, nrow(data.temp))

  # defining the knots in n.s.:
  knots <- (data.ns$BeatNum)[seq(ns.knot, (length(data.ns$BeatNum) - ns.knot), by = ns.knot)]

  # Fitting a Natural Spline Fit (df = 3 by default)
  fit.ns <- lm(data.ns$IBI ~ ns(data.ns$Time, knots = data.ns$Time[knots]))

  # Getting Fitted Values and 95% CI:
  fit.ns.values <- predict(fit.ns, newdata = data.frame(Time = data.temp$Time), interval="prediction", level = 1 - 0.05) # ??? PROBLEM
  data.temp$IBI.NSfit <- fit.ns.values[,1]
  data.temp$IBI.NSfit.L95 <- fit.ns.values[,2]
  data.temp$IBI.NSfit.U95 <- fit.ns.values[,3]

  # Updating OutlierInd based on Natural Spline 95% CI:
  data.temp$OutlierInd <- ifelse(data.temp$IBI < data.temp$IBI.NSfit.U95 & data.temp$IBI > data.temp$IBI.NSfit.L95, 0, 1)
}
4

2 に答える 2

1

コメントを追加したかったのですが、私の担当者レベルではそれが許可されていません。

とにかく、これはよく文書化されたポイントであり、予測はフィット関数で使用される正確な変数名を使用すると思います。したがって、変数に名前を付けることが、私の経験ではこのエラーを回避する最善の方法です。

したがって、上記の場合、このように適合する目的のためだけにデータ フレームを再定義してください。

library(splines)
#Fit part
fit.data <- data.frame(y=rnorm(30),x=rnorm(30))
fit.ns <- lm(y ~ ns(x,3),data=fit.data)

#Predict
pred.data <- data.frame(y=rnorm(10),x=rnorm(10))
pred.fit <- predict(fit.ns,interval="confidence",limit=0.95,data.frame(x=pred.data$x))

私見、これはあなたのエラーを取り除くはずです

于 2013-09-25T07:45:36.300 に答える