`nls` 无法估计我的模型的参数

Posted

技术标签:

【中文标题】`nls` 无法估计我的模型的参数【英文标题】:`nls` fails to estimate parameters of my model 【发布时间】:2017-02-12 16:47:28 【问题描述】:

我正在尝试估计堆定律的常数。 我有以下数据集novels_colection

  Number of novels DistinctWords WordOccurrences
1                1         13575          117795
2                1         34224          947652
3                1         40353         1146953
4                1         55392         1661664
5                1         60656         1968274

然后我构建下一个函数:

# Function for Heaps law
heaps <- function(K, n, B)
  K*n^B

heaps(2,117795,.7) #Just to test it works

所以n = Word OccurrencesKB 是应该是常数的值,以便找到我对 Distinct Words 的预测。

我试过了,但它给了我一个错误:

fitHeaps <- nls(DistinctWords ~ heaps(K,WordOccurrences,B), 
    data = novels_collection[,2:3], 
    start = list(K = .1, B = .1), trace = T)

错误 = Error in numericDeriv(form[[3L]], names(ind), env) : Missing value or an infinity produced when evaluating the model

知道如何解决这个问题或找到适合函数并获取KB 的值的方法吗?

【问题讨论】:

什么意思?我应该记录什么转换?对于 K,我认为它必须是积极的,但我不确定 ... 所以,不需要非线性模型,因为它可以用线性模型解决。 :) 【参考方案1】:

如果对y = K * n ^ B 两边进行对数转换,则得到log(y) = log(K) + B * log(n)。这是log(y)log(n) 之间的线性关系,因此您可以拟合线性回归模型来找到log(K)B

logy <- log(DistinctWords)
logn <- log(WordOccurrences)

fit <- lm(logy ~ logn)

para <- coef(fit)  ## log(K) and B
para[1] <- exp(para[1])    ## K and B

【讨论】:

【参考方案2】:

使用 minpack.lm 我们可以拟合一个非线性模型,但我想它会比对数转换变量上的线性模型更容易过度拟合(正如哲元所做的那样),但我们可以比较残差在一些保留的数据集上使用线性/非线性模型来获得经验结果,这将会很有趣。

library(minpack.lm)
fitHeaps = nlsLM(DistinctWords ~ heaps(K, WordOccurrences, B),
                     data = novels_collection[,2:3], 
                     start = list(K = .01, B = .01))
coef(fitHeaps)
#        K         B 
# 5.0452566 0.6472176 

plot(novels_collection$WordOccurrences, novels_collection$DistinctWords, pch=19)
lines(novels_collection$WordOccurrences, predict(fitHeaps, newdata = novels_collection[,2:3]), col='red')

【讨论】:

以上是关于`nls` 无法估计我的模型的参数的主要内容,如果未能解决你的问题,请参考以下文章

联合估计来自两个NLS回归的参数

R 上 nls 上的 AIC

r语言怎么做每一列和第一列线性回归

记录:EM 算法估计混合高斯模型参数

用 ggpmisc 显示 nls 模型的方程

使用一个数据帧中的值作为在另一个数据帧上估计的模型的参数