0

我正在尝试建立一个非线性模型,如R 中 gmn 手册中所述。模型的期望形式是

y = b0*x0^g0 + b1*x1^g1 + ...

对我来说,这似乎是最简单的非线性模型形式,但出于某种原因(如果我错了,请纠正我!)我必须编写一个自定义非线性函数以将其拟合到 R 中。非常好!

df=read.csv("d:/mydataframe.csv")
require(gnm)

mypower = function(x){
  list(predictors = list(beta=1,gamma=1),
       variables = list(substitute(x)),
       term = function(predlabels,varlabels) {
       paste(predlabels[1],"*(",varlabels[1],"**",predlabels[2],")")
       }
  )
}
class(mypower) <- "nonlin"

现在当我尝试

fit <- gnm(formula=y ~ mypower(x1), data=df)

我从模型中得到了 beta 和 gamma 的拟合值。但是当我尝试

fit <- gnm(formula=y ~ mypower(x1)+mypower(x2), data=df)

我得到错误

Algorithm failed - no model could be estimated.

那么,问题1:我该如何解决这个问题?

此外,当 - 尝试匹配所有 xs - 我尝试

fit <- gnm(formula=PedalCycles ~ mypower(.), data=df)

我明白了

Error in eval(expr, envir, enclos) : object '.' not found

这是指定所有 xs 的总和的正确方法吗?

4

1 回答 1

2

估计y = b_0*x_0^g_0你可以使用 gnm 的内置Exp()来估计

Exp( 1 + I( log(x_0) ) )

这给了你系数:

  1. b'_0对于拦截
  2. g'_0为了log(x_0)

因此g'_0是您想要的g_0(因为e^log(x_0)*g'_0 = x_0^g_0)并且e^b'_0b_0。您的模型现在是这些项的总和。

警告:如果在您的数据集中假设非正值,这将不起作用。x_0

于 2016-05-10T13:57:58.727 回答