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)
}