R 为gnm包编写自定义模型,但需要不在派生表中的函数。有解决办法吗?

R 为gnm包编写自定义模型,但需要不在派生表中的函数。有解决办法吗?,r,gnm,R,Gnm,我正在尝试为gnm编写一个自定义模型,以适应Voigt配置文件。 我已经定义了 library(gnm) ; library(RcppFaddeeva) VOIGT <- function(x) { list(predictors=list(Center=1, Sigma=1, Gamma=1, Alfa=1), variables=list(substitute(x)), term=function(predLabels, varLabels)

我正在尝试为
gnm
编写一个自定义模型,以适应Voigt配置文件。 我已经定义了

library(gnm) ; library(RcppFaddeeva)
VOIGT <- function(x) {
    list(predictors=list(Center=1, Sigma=1, Gamma=1, Alfa=1),
         variables=list(substitute(x)),
         term=function(predLabels, varLabels) {
        paste(predLabels[4], "* RcppFaddeeva::Voigt(", varLabels[1], ", ", predLabels[1], ", ", predLabels[2], ", ", predLabels[3], ")" )
    },
    start=function(theta) {
     theta[2] <- 1 ; theta[3] <- 1; theta[4] <- 1
        } )
}

class(VOIGT) <- "nonlin"  

有解决办法吗?或者这需要扩展到
gnm
,或者完全其他的方法吗?

您可以使用
nls
使用最小二乘法拟合模型

例如,从Voigt配置文件生成一些数据:

library(RcppFaddeeva)
x <- seq(-1000, 1000)
v <- Voigt(x, 200, 100, 30)
在响应中添加一些高斯噪声

y2 <- y2 + rnorm(n, mean = 0, sd = 1e-4)
从图中,我们可以看到中心在250左右,如果我们用高斯近似轮廓,我们可能会猜测sigma在100左右(轮廓从中心下降到0,大约是sigma的3倍)。这给出了参数的起始值(我们可以尝试将alpha和gamma设置为1)


gnm
使用分析导数,因此不能与不在导数表中的函数一起使用。但是,在本例中,您可以使用
nls
,请参见下面我的答案。这是针对高斯噪声,但对于应用程序(即:)存在泊松噪声。另一个问题:是否可以更改/增强
gnm
以使用CRAN package
Deriv
,从而可以添加到导数表中?如果是这样的话,我可以尝试一下……这就解释了为什么您现在尝试使用
gnm
。使用
Deriv
更新
gnm
可能会起作用,我认为只需要将
Deriv
替换为
Deriv
。然后用户可以向表中添加导数,这是最难的部分,但允许一些扩展。很高兴在GitHub上做公关。
n <- 50
id <- sort(sample(seq_along(v), n))
x2 <- x[id]
y2 <- v[id]
y2 <- y2 + rnorm(n, mean = 0, sd = 1e-4)
plot(y2 ~ x2)
fit <- nls(y2 ~ alpha*Voigt(x2, x0, sigma, gamma), 
           start = list(alpha = 1, x0 = 250, sigma = 100, gamma = 1))
fit
#> Nonlinear regression model
#>   model: y2 ~ alpha * Voigt(x2, x0, sigma, gamma)
#>    data: parent.frame()
#>    alpha       x0    sigma    gamma 
#>   0.9884 201.0276 101.2246  27.2556 
#>  residual sum-of-squares: 5.771e-07
#> 
#> Number of iterations to convergence: 5 
#> Achieved convergence tolerance: 2.66e-06
lines(fitted(fit)~x2)