Вопросы по оптимизации в R - PullRequest
1 голос
/ 06 апреля 2020

Следующий код был представлен нашим учителем на практическом занятии. У меня есть вопросы по поводу последней строки кода на этапе оптимизации с использованием функции optim(), но я добавляю другие строки для пояснения работы.

population <- read.csv("data.csv", header=FALSE, sep=';', dec=',')

и данные выглядят следующим образом:

1      8.29

2      5.37

3      10.61

4      5.92

5      14.99

6      9.74

7      15.47
    .
    .
    .

Мы выбираем 100 элементов из совокупности как

Sampled_Data <- sample(population$V1, 100) 

, а затем пишем функцию для вычисления вероятности "логарифмического нормального распределения" для выбранных элементов как

MyFunc <- function(Myparameters,data){
      Firstparameter <- Myparameters[1]
      Secondparameter <- Myparameters[2] 
      n <- length(data)
      Mydistribution <- -n/2*log(2*pi*(Secondparameter^2)) - sum(log(data)) - (1/(2*Secondparameter^2))*sum((log(data)-Firstparameter)^2) 
      return(Mydistribution) 
    }

Наконец, мы используем функцию optim() для оценки двух параметров распределения, используя функцию максимума правдоподобия

optimisation <- optim(c(1,1),MyFunc,data=Sampled_Data)

в функции optim(), я не понимаю, почему он добавил вектор c(1,1) пока из документации мы должны его заполнить начальными значениями параметров? он предполагает, что начальные значения 1 и 1? если так, то исходя из того, что мы принимаем за начальные значения.

Кроме того, почему он добавил data=Sampled_Data, тогда как в документации нет ничего подобного? Из документации, после добавления функции, мы должны добавить другие вещи, такие как градиент, метод и границы! но не данные, которые у нас есть!

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

Я был потерян, где разместить вопрос, здесь или в перекрестной проверке, но я видел подобные вопросы здесь. В любом случае, если это не подходящее место, я удалю вопрос.

1 Ответ

1 голос
/ 06 апреля 2020

Безымянные аргументы для функций в R присваиваются в порядке их появления в определении.

Если мы посмотрим на справку по help(optim):

Usage
optim(par, fn, gr = NULL, ...,
      method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN",
                 "Brent"),
      lower = -Inf, upper = Inf,
      control = list(), hessian = FALSE)

Мы увидим, что первый аргумент по умолчанию - par. Следовательно, вы правы, что ваш инструктор установил par = c(1,1) и fn = MyFun. В help(optim) вы также увидите, что вы можете установить аргументы upper = и lower =.

Если вы вернетесь к определению MyFun, вы увидите, что первый аргумент - Myparameters. Следовательно, когда вызывается optim, c(1,1) передается в MyFun в качестве первого аргумента. Таким образом, на начальном этапе для Firstparameter и Secondparameter будет установлено значение 1.

Наконец, если вы внимательно посмотрите на help(optim):

Usage
optim(par, fn, gr = NULL, ...,
      method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN",
                 "Brent"),
      lower = -Inf, upper = Inf,
      control = list(), hessian = FALSE)

Arguments
par Initial values for the parameters to be optimized over.

fn  A function to be minimized (or maximized), with first argument the vector of parameters over which minimization is to take place. It should return a scalar result.

gr  A function to return the gradient for the "BFGS", "CG" and "L-BFGS-B" methods. If it is NULL, a finite-difference approximation will be used.

... Further arguments to be passed to fn and gr.

You увидим, что ... может быть дополнительными аргументами для передачи fn и, следовательно, MyFun. В этом случае data=Sampled_Data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...