Сплайны внутри нелинейных наименьших квадратов в R

Рассмотрим нелинейную модель наименьших квадратов в R, например, в следующей форме):

 y ~ theta / ( 1 + exp( -( alpha + beta * x) ) )

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

Я хотел бы заменить термин «альфа + бета * x» на (скажем) естественный кубический шлиц.

вот некоторый код для создания некоторых примеров данных с нелинейной функцией внутри логистики:

set.seed(438572L)
x <- seq(1,10,by=.25)
y <- 8.6/(1+exp( -(-3+x/4.4+sqrt(x*1.1)*(1.-sin(1.+x/2.9))) )) + rnorm(x, s=0.2 )

Без необходимости в логистике вокруг этого, если бы я был в lm, я мог бы легко заменить линейный член сплайновым членом; Таким образом, линейная модель выглядит примерно так:

 lm( y ~ x ) 

затем становится

 library("splines")
 lm( y ~ ns( x, df = 5 ) )

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

Действительно, сопоставление исходных данных с помощью сплайна на основе lm не так уж и плохо, но есть причина, по которой мне это нужно внутри логистической функции (или, скорее, эквивалент в моей задаче).

Проблема с nls в том, что мне нужно указать имена для всех параметров (я вполне доволен, что назову их, скажем (b1, ..., b5) для одного сплайна (и скажем c1, ..., c6) для другой переменной - мне нужно будет сделать несколько из них).

Есть ли достаточно удобный способ сгенерировать соответствующую формулу для nls, чтобы я мог заменить линейный член внутри нелинейной функции сплайном?

Единственные способы, которыми я могу предположить, что это можно сделать, - это немного неудобно и неуклюже, и не удастся хорошо обобщить, не написав целую кучу кода.

( отредактируйте для пояснения ) Для этой небольшой задачи я, конечно, могу сделать это вручную - написать выражение для внутреннего произведения каждой переменной в матрице, сгенерированной нс , умноженный на вектор параметров. Но затем я должен снова писать все понемногу для каждого сплайна в каждой другой переменной, и снова каждый раз, когда я меняю df в любом из сплайнов, и снова, если я хочу использовать cs вместо ns. И затем, когда я хочу попытаться сделать какое-то предсказание (/ интерполяция), мы получаем совершенно новый набор проблем, с которыми нужно иметь дело. Мне нужно продолжать делать это снова и снова и, возможно, для значительно большего количества узлов и нескольких переменных, для анализа за анализом - и я подумал, есть ли более аккуратный и простой способ, чем записывать каждый отдельный термин, без написания большого количества кода. Я вижу довольно рискованный способ сделать это, который потребует изрядного количества кода для правильного решения, но, будучи R, я подозреваю, что есть гораздо более аккуратный способ (или, что более вероятно, 3 или 4 более аккуратных способа), который просто ускользает от меня. Отсюда вопрос.

Мне показалось, что я видел, как в прошлом кто-то делал что-то подобное в довольно приятной манере, но хоть убей, я не могу найти его сейчас; Я много раз пытался найти его.

[В частности, я обычно хотел бы иметь возможность попробовать подогнать любой из нескольких различных сплайнов в каждой переменной - попробовать несколько вариантов - чтобы увидеть, смогу ли я найти простую модель, но все же одну где подгонка подходит для этой цели (шум действительно довольно низкий; некоторый перекос в подгонке допустим для достижения хорошего гладкого результата, но только до определенного предела). Это скорее «найти красивую, интерпретируемую, но адекватную функцию», чем что-либо подобное, связанное с выводом и интеллектуальным анализом данных, на самом деле не проблема для этой проблемы.]

В качестве альтернативы, если бы это было намного проще, скажем, gnm или ASSIST или что-то еще о других пакетах, это было бы полезно, но тогда вам помогут некоторые советы о том, как решить проблему с игрушкой, описанную выше.

5
задан Glen_b 4 February 2012 в 21:39
поделиться