В основном, все, что я хочу сделать, это предсказать скалярный ответ, используя некоторые кривые. Я дошел до регрессии (используя fRegress из пакета fda), но не знаю, как применить результаты к НОВОМУ набору кривых (для прогнозирования).
У меня N = 536 кривых и 536 скалярных ответов. Вот что я сделал до сих пор:
- Я создал основу для кривых.
- Я создал объект fdPar, чтобы ввести штраф
- Я создал объект fd, используя smooth.basis, чтобы сгладить кривые с выбранным штрафом на указанной основе.
- Я запустил регрессию с помощью fRegress (), регрессирующей кривые скалярного отклика.
Теперь все, что я хотел бы сделать, это использовать эту регрессию для создания прогнозов для нового набора данных, который у меня есть. Я не могу найти легкий способ сделать это.
ура
predict.fRegress
помощьюnewdata
опции (из руководства ФДА здесь )?fda
пакетом. Я писал ответ, который включал получение прогнозов вручную, но большая часть его была потеряна из-за того, что она не была сохранена. Если кто-то еще не побьет меня, я должен найти решение для вас через пару дней.Ответы:
Меня не волнует
fda
использование Inception- подобных списочно-структурных объектов-списков-в-списках, но мой ответ будет зависеть от системы, созданной создателями пакетов.Я думаю, поучительно сначала подумать о том, что именно мы делаем. Исходя из вашего описания того, что вы сделали до сих пор, я верю, что вы делаете это (дайте мне знать, если я что-то неправильно понял). Я буду продолжать использовать нотацию и, из-за отсутствия реальных данных, пример из анализа функциональных данных Рамсея и Сильвермана и анализа функциональных данных Рамзея, Хукера и Грейвса с помощью R и MATLAB (некоторые из следующих уравнений и кода были сняты напрямую из этих книг).
Мы моделируем скалярный отклик через функциональную линейную модель, т.е.
Разложим в некотором базисе. Мы используем, скажем, K базисных функций. Так,β К
В матричной записи это .β( s ) = θ'( s ) b
Мы также расширяем ковариатные функции в некотором базисе (скажем, базисных функций). Так,L
Опять же, в матричной записи это .Икс( s ) = C ψ ( s )
И, таким образом, если мы позволим , наша модель может быть выражена какJ =∫ψ ( s ) θ'( s ) ds
И если мы допустим и , наша модель будетξ = [ β 0Z = [ 1C J ] ξ = [ β0б']'
И это выглядит гораздо более знакомым для нас.
Теперь я вижу, что вы добавляете некоторую регуляризацию.
fda
Пакет работает с шероховатостью штрафами формыдля некоторого линейного дифференциального оператора . Теперь можно показать (подробности здесь опущены - это действительно не сложно показать), что если мы определим штрафную матрицу какRL р
где в терминах базисного расширения , тогда мы минимизируем штрафную сумму квадратов:β iря βя
и поэтому наша проблема - всего лишь регрессия гребня с решением:
Я прошел через вышесказанное, потому что, (1) я думаю, что важно, чтобы мы понимали, что мы делаем, и (2) некоторые из вышеперечисленных необходимы для понимания части кода, который я буду использовать позже. На коду ...
Вот пример данных с кодом R Я использую канадский набор данных о погоде, представленный в
fda
пакете. Мы будем моделировать логарифм годовых осадков для ряда метеостанций с помощью функциональной линейной модели и будем использовать температурные профили (температуры регистрировались один раз в день в течение 365 дней) для каждой станции в качестве функциональных ковариат. Мы будем действовать так же, как вы описываете в вашей ситуации. Данные были зарегистрированы на 35 станциях. Я разделю набор данных на 34 станции, которые будут использоваться в качестве моих данных, и последнюю станцию, которая будет моим "новым" набором данных.Я продолжаю через код R и комментарии (я предполагаю, что вы достаточно знакомы с
fda
пакетом, так что ничто из следующего не является слишком удивительным - если это не так, пожалуйста, дайте мне знать):Теперь, когда год назад мне впервые рассказали о функциональных данных, я поиграл с этим пакетом. Я также был не в состоянии
predict.fRegress
дать мне то, что я хотел. Оглядываясь назад, я все еще не знаю, как заставить его вести себя. Итак, нам просто нужно получить прогнозы полу-вручную. Я буду использовать части, которые я вытащил прямо из кодаfRegress()
. Я снова продолжаю через код и комментарии.Во-первых, установка:
Теперь, чтобы получить прогнозы
Я просто беру код, который∫T0Икся( s ) β( s ) Икся β
fRegress
использует для вычисленияyhatfdobj
и немного его редактировать.fRegress
вычисляетyhatfdobj
путем оценки интеграла помощью правила трапеции (с и развернутыми в соответствующих базах). X i βКак правило,
fRegress
вычисляет подогнанные значения, просматривая ковариаты, хранящиеся вannPrecTemp$xfdlist
. Так что для нашей проблемы, мы заменим этот ковариативный список с соответствующим одным в нашем новом списке ковариата, то естьtemplistNew
. Вот код (идентичный кодуfRegress
с двумя правками, удалению ненужного кода и добавлению пары комментариев):(примечание: если вы посмотрите на этот фрагмент и окружающий код
fRegress
, вы увидите шаги, которые я описал выше).Я протестировал код, повторно запустив пример погоды, используя все 35 станций в качестве наших данных, и сравнил вывод из вышеуказанного цикла с
annPrecTemp$yhatfdobj
и все совпадает. Я также запускал его пару раз, используя разные станции в качестве «новых» данных, и все кажется разумным.Дайте мне знать, если что-то из перечисленного неясно или что-то работает неправильно. Извините за слишком подробный ответ. Я не мог с собой поделать :) И если вы еще не владеете ими, посмотрите две книги, которые я использовал, чтобы написать этот ответ. Это действительно хорошие книги.
источник
nfine