`nls` не может оценить параметры моей модели

Я пытаюсь оценить константы для закона кучи. У меня есть следующий набор данных 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 Occurrences, K и B — это значения, которые должны быть константами, чтобы найти мой прогноз различных слов.

Я пробовал это, но это дает мне ошибку:

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

Любая идея о том, как я могу исправить это или метод, чтобы соответствовать функции и получить значения для K и B?


person Saul Garcia    schedule 04.10.2016    source источник
comment
Что ты имеешь в виду? что я должен преобразовать в журнал? а для K я думаю, что он должен быть положительным, но я не уверен   -  person Saul Garcia    schedule 04.10.2016
comment
... следовательно, нелинейная модель не нужна, потому что ее можно решить с помощью линейной модели. :)   -  person Roman Luštrik    schedule 04.10.2016


Ответы (2)


Если вы выполните логарифмическое преобразование с обеих сторон от 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
person Zheyuan Li    schedule 04.10.2016

С помощью minpack.lm мы можем подобрать нелинейную модель, но я предполагаю, что она будет склонна к переоснащению в большей степени, чем линейная модель на логарифмически преобразованных переменных (как это сделал Zheyuan), но мы можем сравнить остатки линейного / нелинейная модель на каком-то наборе данных, чтобы получить эмпирические результаты, на которые будет интересно посмотреть.

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')

введите здесь описание изображения

person Sandipan Dey    schedule 04.10.2016