考虑 R 中的非线性最小二乘模型,例如以下形式):
y ~ theta / ( 1 + exp( -( alpha + beta * x) ) )
(我真正的问题有几个变量,外部函数不是逻辑的,而是涉及更多;这个更简单,但我认为如果我能做到这一点,我的案例应该几乎立即跟进)
我想用(比如说)自然三次样条代替术语“alpha + beta * 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 生成相应的公式,以便我可以用样条曲线替换非线性函数中的线性项?
我能想到的唯一方法是有点笨拙和笨拙,并且如果不编写一大堆代码就不能很好地概括。
(编辑澄清)对于这个小问题,我当然可以手工完成 - 为ns生成的矩阵中每个变量的内积写一个表达式, 乘以参数向量。但是然后我必须为每个其他变量中的每个样条再次逐项编写整个内容,并且每次我更改任何样条中的 df 时,如果我想使用 cs 而不是 ns,则再次编写。然后当我想尝试做一些预测(/插值)时,我们会遇到一系列全新的问题需要处理。我需要一遍又一遍地继续这样做,并且可能需要大量的结和多个变量,以便在分析后进行分析 - 我想知道是否有比写出每个单独的术语更简洁、更简单的方法,无需编写大量代码。我可以看到一种相当牛逼的方法来做到这一点,这需要相当多的代码才能正确,但是作为 R,我怀疑有一种更简洁的方法(或者更可能是 3 或 4 种更简洁的方法) ' 只是在躲避我。因此问题。
我以为我过去曾看到有人以相当不错的方式做这样的事情,但是对于我的生活,我现在找不到它;我已经尝试了很多次才能找到它。
[更具体地说,我通常希望能够尝试拟合每个变量中的几个不同样条曲线中的任何一个 - 尝试几种可能性 - 以查看我是否可以找到一个简单的模型,但仍然是一个适合的模型足以达到目的(噪音真的很低;拟合中的一些偏差可以达到很好的平滑结果,但只能达到一定程度)。它比任何接近推理的方法都更“找到一个好的、可解释的但足够的拟合函数”,而数据挖掘对于这个问题来说并不是一个真正的问题。]
或者,如果这在 gnm 或 ASSIST 或其他软件包之一中会更容易,那将是有用的知识,但是关于如何使用它们处理上述玩具问题的一些指示会有所帮助。