2013-09-25 3 views
1

У меня возникли проблемы с использованием функции прогноза() в R, и я надеюсь, что смогу получить некоторую помощь. Рассмотрим набор данных с двумя столбцами - 1) Y, 2) XПроблемы с функцией прогнозирования в R

Моя цель - установить естественную сплайнную форму и получить 95% ДИ и отметить точки вне 95% ДИ как выброс. Вот что я делаю:

1) Изначально никакая точка в наборе данных не была отмечена как выброс. 2) Я приспосабливаю свои ns и использую свой 95% CI, я отмечаю точки вне CI как outlier 3) Затем я исключаю изначально выделенные выбросы и устанавливаю другое ns и используя его 95% CI, I отметьте выбросы.

* Вопрос: * Предположим, что мой первоначальный набор данных имеет 1000 обс. Я отмечаю некоторые выбросы в первом раунде, и я получаю 23 выброса. Затем я устанавливаю другой ns (назовем его fit.ns), используя оставшиеся 977 не-outliers. Затем я использую ALL X (все 1000), чтобы получить предсказанные значения на основе этой новой подгонки, но я получаю предупреждение AND, что newdata в моей функции прогнозирования имеет 1000 obs, но fit имеет 977. Возвращенные предсказанные значения также имеют 977 значений и NOT 1000.

* Мой предсказать (код) *

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

ответ

2

Наконец, я нашел решение:

Когда я подхожу к модели, я должен использовать опцию «data =». Другими словами, вместо следующей команды,

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

следует использовать команду ниже вместо этого:

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

Тогда функция предсказать, будет работать.

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

ИМХО, это должно избавиться от ошибки

+0

Привет, спасибо, что ответит. Я сомневаюсь, что это проблема. Обратите внимание, что в приведенном выше примере вы используете ту же «pred.data» для подгонки модели и получения прогноза от модели, и именно по этой причине вы не получаете ошибку. Я попробовал ваше решение, переименовав переменные, но, как я и ожидал, у меня все еще есть ошибка. Спасибо за Ваш ответ. – Sam

+1

Пока имена переменных одинаковы, вы можете использовать прогноз для нового набора данных, но с теми же именами переменных. В вашем случае вы используете «data.NS $ Time» в качестве зависимой переменной, пытаясь предсказать, что вы используете 'data.frame (Time = data.temp $ time)' – vins

Смежные вопросы