Прогнозирование с помощью объекта lm в R - парадигма черного ящика - PullRequest
1 голос
/ 17 августа 2011

У меня есть функция, которая возвращает объект lm.Я хочу произвести прогнозные значения на основе некоторых новых данных.Новые данные - это data.frame в точном формате, как данные, переданные в функцию lm, за исключением того, что ответ был удален (так как мы предсказываем, а не обучаем).Я ожидал выполнить следующее, но получил бы ошибку:

predict( model , newdata )
"Error in eval(expr, envir, enclos) : object 'ModelResponse' not found"

В моем случае ModelResponse был именем столбца ответа в данных, на которых я первоначально тренировался.Так что просто ради удовольствия я попытался вставить ответ NA:

newdata$ModelResponse = NA
predict( model , newdata )
Error in terms.default(object, data = data) : no terms component nor attribute

Очень расстраивает!Понятие моделей / регрессии в R не соответствует моему: 1. Я обучаю модель некоторым данным и получаю объект модели.2. Я могу получить новые данные из любой среды / функции / кадра / и т. Д.до тех пор, пока я вводю данные в объект модели, который «похож на» данные, на которых я тренировался (то есть те же имена столбцов).Это стандартная парадигма черного ящика.

Итак, вот мои вопросы:
1. Какие концепции я здесь упускаю?
2. Как заставить мой сценарий работать?
3. Как я могу сделать объект модели переносимым?str (модель) показывает мне, что объект модели сохранил исходные данные, на которых он обучался!Таким образом, объект модели массивный.Я хочу, чтобы моя модель была переносимой для любой функции / среды / и т. Д.и содержат только те данные, которые ему необходимы для оценки.

Ответы [ 2 ]

5 голосов
/ 17 августа 2011

В отсутствие str () для модели или данных, предлагаемых модели, вот мое предположение относительно этого сообщения об ошибке:

predict( model , newdata )
"Error in eval(expr, envir, enclos) : object 'ModelResponse' not found"

Я предполагаю, что вы создали объект модели с именем "model""и что ваша исходная переменная (левая часть формулы (в исходном обращении к lm) называлась" ModelResponse ", и что вы затем назвали столбец в newdata с тем же именем. Но что вы должны сделали, пропустили столбцы «ModelResponse» (потому что это то, что вы предсказываете) и поместили в «Model_Predictor1», Model_Predictor2 »и т. Д., Т. Е. Все имена в правой частиформула, заданная для lm ()

Функция coef () позволит вам извлечь информацию, необходимую для переноса модели.

mod.coef <- coef(model)
mod.coef

Поскольку вы проявили интерес к пакету rms / Hmisccombo Function, здесь он использует справочный пример из ols и сравнивает вывод с извлеченной функцией и методом rms Predict. Обратите внимание на заглавные буквы, так как они предназначеныd для работы с пакетными эквивалентами lm и glm(..., family="binomial") и coxph, которые в среднеквадратичных значениях становятся ols, lrm и cph.

> set.seed(1)
> x1 <- runif(200)
> x2 <- sample(0:3, 200, TRUE)
> distance <- (x1 + x2/3 + rnorm(200))^2
> d <- datadist(x1,x2)
> options(datadist="d")   # No d -> no summary, plot without giving all details
> 
> 
> f <- ols(sqrt(distance) ~ rcs(x1,4) + scored(x2), x=TRUE)
> 
> Function(f)
function(x1 = 0.50549065,x2 = 1) {0.50497361+1.0737604* x1- 
   0.79398383*pmax(x1-0.083887788,0)^3+ 1.4392827*pmax(x1-0.38792825,0)^3-  
   0.38627901*pmax(x1-0.65115162,0)^3-0.25901986*pmax(x1-0.92736774,0)^3+ 
   0.06374433*x2+ 0.60885222*(x2==2)+0.38971577*(x2==3) }
<environment: 0x11b4568e8>
> ols.fun <- Function(f)
> pred1 <- Predict(f, x1=1, x2=3)
> pred1
  x1 x2     yhat    lower    upper
1  1  3 1.862754 1.386107 2.339401

Response variable (y): sqrt(distance) 

Limits are 0.95 confidence limits
# The "yhat" is the same as one produces with the extracted function
> ols.fun(x1=1, x2=3)
[1] 1.862754

(я узналисходя из опыта, для функций ограниченного кубического сплайна, приходящих из среднеквадратичного значения, необходимо добавить пробелы и возврат каретки для улучшения читабельности.)

2 голосов
/ 17 августа 2011

Думая о долгосрочной перспективе, вам, вероятно, стоит взглянуть на пакет caret.Многие или большинство функций моделирования работают с фреймами данных и матрицами, другие имеют предпочтения, и могут быть другие варианты их ожиданий.Важно быстро обдумать каждый, но если вам нужна отдельная оболочка, которая упростит вам жизнь, превратив сложности в «черный ящик», тогда caret настолько близко, насколько вы можете.

В качестве отказа от ответственности: я не использую caret, так как не думаю, что моделирование должно быть черным ящиком.У меня было несколько писем к авторам пакетов моделирования, полученных в результате изучения их кода и обнаружения чего-то неладного.Завершение этого в другой слой не будет служить моим интересам.Таким образом, в долгосрочной перспективе избегайте caret и развивайте удовольствие, разбирая то, что входит в различные функции моделирования и выходит из них.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...