Рассмотрим нелинейную модель наименьших квадратов в 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 или что-то еще о других пакетах, это было бы полезно, но тогда вам помогут некоторые советы о том, как решить проблему с игрушкой, описанную выше.