Как найти начальные значения модели нелинейной регрессии? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь приспособить нелинейную модель высоты диаметра дерева (Max & Burkhart, 1976) к моему набору данных (состоит из D, диаметр высоты груди (см); H, общая высота дерева (м); hiвысота сечения от уровня земли, диаметр на высоком уровне и т. д.) в R.

У меня проблемы с подгонкой модели.Я думаю, что это из-за начальных значений параметров уравнения.Я получаю ошибки "NaNs произведены".Я пытался настроить начальные параметры.Количество ошибок уменьшилось до 1, но не до нуля.Поэтому мне нужно найти способ оценки начальных параметров для нелинейной регрессионной модели.Я искал Самозапускающиеся модели, но не смог применить свое уравнение из-за сложности уравнения и недостатка знаний.Я добавлю сюда все свои данные, чтобы вы, ребята, могли показать мне путь.

Кстати, я не уверен, смогу ли я прикрепить файлы к своему вопросу, поэтому я дам ссылку на свой набор данных для всех, кто хочет просмотреть или скачать.Я загрузил свои данные на гугл диск, и ссылка https://drive.google.com/file/d/1q7W1bUcx4sK2G2QPte7ZtCudSLfBxpet/view?usp=sharing

# Function to compute Max & Burkhart (1976) equation
ComputeDi.MaxBurkhart <- function(hi, d, h, b1, b2, b3, b4, a1, a2){
    x <- hi / h
    x1 <- x - 1 
    x2 <- x ^ 2 - 1
    di <- d * sqrt(b1 * x1 + b2 * x2 + b3 * (a1 - x) ^ 2 * ((a1 - x) >= 0.0) + b4 * (a2 - x) ^ 2 * ((a2 - x) >= 0.0))
    return(di)
}

# Set the working directory
setwd("../Data")

# Load data and rename some variables
sylvestris <- read.csv("mydata.csv")

# Global fitting
nlmod.fp.di <- nls(di ~ ComputeDi.MaxBurkhart(hi, d, h, b1, b2, b3, b4, a1, a2), data = sylvestris, start = c(b1 = -2.53, b2 = 1.2, b3 = -1.5, b4 = 22, a1 = 0.72, a2 = 0.15

), control = nls.control(tol = 1e-07))
summary(nlmod.fp.di, correlation = T)

Пока все здесь нормально.После этого я получаю ошибки Nan!

# Set seed and select names of trees
trees <- unique(sylvestris$tree) 
set.seed(15)
result.list <- list()
i <- 1
while(length(trees) > 0){
    tree.smp <- sample(trees, 10, replace = F)
    sylvestris.smp <- sylvestris[sylvestris$tree %in% tree.smp, ]
    fitting.ols <- try(nls(di ~ ComputeDi.MaxBurkhart(hi, d, h, b1, b2, b3, b4, a1, a2), data = sylvestris.smp, start = c(b1 = -2.53, b2 = 1.2, b3 = -1.5, b4 = 22, a1 = 0.72, a2 = 0.15

), control = nls.control(tol = 1e-07)), silent = T)
    if(class(fitting.ols)[1] == "try-error"){
            fit.smp <- data.frame(trees = paste(tree.smp, collapse = "_"), 
t(rep(NA, 8)))
            names(fit.smp) <- c("trees", "b1", "b2", "b3", "b4", "a1", 
"a2", "NS", "RSE")
    } else {
            nlmod.ols <- fitting.ols
            fit.smp <- data.frame(trees = paste(tree.smp, collapse = "_"), t(coef(fitting.ols)), NS = sum(summary(fitting.ols)$parameters[, 4] > 0.05), RSE = summary(fitting.ols)$sigma)
    }
    result.list[[i]] <- fit.smp
    i <- i + 1
    trees <- trees[!trees %in% tree.smp]        
}     

Я ожидаю значительных оценок параметров без каких-либо ошибок NaN.Я уверен, что проблема заключается в начальных значениях, потому что этот блок кода отлично работает с другим набором данных.Когда я изменил данные, я получаю эти ошибки.Заранее спасибо.

1 Ответ

0 голосов
/ 26 апреля 2019

Можно попробовать использовать пакет nls.multstart, который сделан для упрощения оценки начальных значений.

Можно в основном указать диапазоны начальных параметров, и регрессия будет производиться с использованием лучших параметров на основе AIC оценка.

...