2016-05-31 5 views
0

Проблемы:Перекрестная проверка для нелинейной регрессии с помощью NLS в R

У меня есть набор данных inputAll.data. Я хочу использовать 80% данных в качестве ввода модели и проверить модель на оставшиеся 20% данных.

Я вручную разделил набор данных на два меньших набора данных input80.data и input20.data, содержащих 80% и 20% данных соответственно.

Формат данных в моих наборах данных:

Name  xvalues  yvalues 
Prog1  0.654219 59.70282 
Prog2  0.149516 49.59548 
Prog3  0.50577  50.53859 
Prog4  0.77783  59.95499 
Prog5  0.237923 49.61133 
Prog6  0.756063 50.63021 
Prog7  0.015625 53.77959 

Я использую 80% данные для построения нелинейной модели регрессии с использованием nls.

df = data.frame(input80.data) 
yval = df$yvalues 
xval = df$xvalues 
model1 = nls(formula = yval ~ exp(xval + beta * xval), start = list(beta = 0)) 
sm1 = summary(model1) 
fit1 = fitted.values(model1) 

Я беру оставшиеся 20% данные для получения прогнозируемых значений. Я сохранил копию этих данных, которая содержит фактические значения y в другом файле с именем input20Actual.data, но input20.data содержит только значения x.

dfNew = data.frame(input20.data) 
xpred = dfNew$xvalues 
dfVerify = data.frame(input20Actual.data) 
yverify = dfVerify$yvalues 
xverify = dfVerify$xvalues 

obtainedPred = predict(model1, data.frame(xvalues = c(xpred))) 

Я затем с помощью пользовательской функции с именем RMSE, чтобы вычислить погрешность между предсказанием и фактическим значением.

RMSE <- function(fitted, actual){ 
    sqrt(mean((fitted - actual)^2)) 
} 

Расчет ошибок осуществляется путем взятия каждого предсказанного значения и сравнивая его с фактическим значением, которое я хранящегося в input20Actual.data. Я сохраняю вывод в файле.

sink("ErrorsOut.txt") 
cat("\n\nRMSE:\n") 
for (i in 1:13) { 
    #There are 13 values to be predicted in input20.data 
    corr = obtainedPred[[i]] 
    act = yverify[[i]] 
    err = RMSE(act, corr) 
    cat(err) 
    cat(" ") 
} 
cat("\n") 
sink() 

Проблема в том, что я вручную разделил входной набор. Я хотел бы автоматизировать это и делать то же самое для разных расщеплений (каждый раз каждый раз) и получать среднее значение расчетных ошибок.

Что я пробовал:

Я прочитал на StackOverflow о перекрестной проверке в R. Я понимаю, что это итеративно занимает некоторое% данные для создания модели, а остальное для тестирования. Если я могу использовать функцию перекрестной проверки в nls, мне не нужно разделить мои входные данные на два файла.

Я искал на SO много для решения. Многие ответы о перекрестной проверке были для lm. Но я специально требую перекрестной проверки для nls. Я также читал о caret пакете, но я попытался установить его и, но большую часть времени я в конечном итоге получить ошибки установки пакета, как показано ниже:

Warning: dependency ‘plyr’ is not available 
package ‘plyr’ is not available (for R version 3.0.2) 

Так что я надеялся, что был прямой путь для выполнения перекрестной проверки (в rkward) без установки большего количества пакетов. Есть ли функция или API в R, которую я могу использовать для итеративного создания моделей и их тестирования?

Обратите внимание, что я полный новичок R. Извините, если это очевидный вопрос.

+0

Вам необходимо обновить свое R. Вы в версии 3.0.2, и в настоящее время мы находимся на 3.3.0. Как только вы это сделаете, вы сможете установить пакет '' caret'' –

+0

@CyrusMohammadian Но я установил R, используя 'sudo apt-get install r-base'. Я просто повторил это, и он говорит, что r-base - это уже самая новая версия. Является ли версия 3.3.0 своего рода пакетом? Я использую R с rkward, и я выполнил шаги, которые я видел здесь: http://www.r-bloggers.com/download-and-install-r-in-ubuntu/ – Kajal

+0

Кроме того, если я абсолютно _have_ для обновления , означает ли это, что не существует способа выполнить перекрестную проверку самой версии, и никакой функции/API в R, которую я могу использовать напрямую? – Kajal

ответ

2

Используя встроенную фрейму данных BOD попробуйте простую модель, показанную в fo ниже.Сначала используйте sample, чтобы получить индексы строк в выборке и запустить модель на них. predict.nls затем используется для получения прогнозируемых значений с использованием данных вне образца с моделью в образце. Отсюда можно вычислить остаточную сумму квадратов (RSS) и другие результаты. Каждый раз, когда это выполняется, sample генерирует, возможно, другой набор индексов (при условии, что set.seed не будет повторно запущен). Это может быть упаковано в функцию и запускаться повторно. Пакеты не используются.

set.seed(123) # for reproducibility 

n <- nrow(BOD) 
frac <- 0.8 
ix <- sample(n, frac * n) # indexes of in sample rows 

fo <- demand ~ a + Time * b 
fm <- nls(fo, BOD, start = c(a = 0, b = 0), subset = ix) # in sample model 

BOD.out <- BOD[-ix, ] # out of sample data 
pred <- predict(fm, new = BOD.out) 
act <- BOD.out$demand 
RSS <- sum((pred - act)^2) 
RSS 
+0

Спасибо! после этого он генерирует разные данные (без повторения 'set.seed'). Я подберу это, чтобы использовать его с моим набором данных. Спасибо за помощь. – Kajal