Подгонка параметрической плотности к постоянной кусочной функции в R, аргумент отсутствует ошибка

Предположим, кто-то нарисовал мне гистограмму, и я хочу ее сгладить и получить сглаженную функцию. Это способ сделать это в R? (Гистограмма не исходит из данных, поэтому оценки плотности ядра не кажутся адаптированными. Пожалуйста, сообщите мне, если вы думаете, что я ошибаюсь.)

До сих пор я предпочитал подгонять параметрическое распределение к своей гистограмме. Для этого я минимизирую интегральную квадратичную ошибку между моей гистограммой и бета-распределением. Вот мой код, где h — кусочно-постоянная функция с опорой [0;1].

h<-function(x) (x>0 & x<1)*1

    fit.beta<-function(h){
      dist<-function(alpha,beta){
            diff2<-function(x)(h(x)-dbeta(x,alpha,beta))^2          
            return(integrate(diff2,0,1))
      }
      res<-constrOptim(theta = c(1,1), f = dist,grad=NULL, ui = matrix(c(1,1),1,2), ci = c(0,0)) 
      return<-res
    }

И Р говорит:

 Error in dbeta(x, alpha, beta) : 
  argument "beta" is missing, with no default

Я не понимаю, почему R не понимает dbeta(x, alpha, beta). Я также пробовал с dbeta(x, shape1=alpha, shape2=beta), это не работает. Не могли бы вы помочь мне?


person Mothas    schedule 22.04.2014    source источник
comment
Бьюсь об заклад, ваш код не работает из-за вашей матрицы ограничений ui (ваш аргумент ui должен быть матрицей 2x2, см. ?constrOptim). Я не могу вам помочь без воспроизводимого примера... В противном случае, я бы посоветовал вам использовать пакет fitdistr, а не пытаться делать подгонку с нуля, см. stat.ethz.ch/R-manual/R-patched/library/MASS/html/fitdistr.html :)   -  person Jealie    schedule 22.04.2014
comment
Спасибо посмотрю :)   -  person Mothas    schedule 23.04.2014
comment
Функция fitdistr не выглядит адаптированной, ей нужны данные для вычисления оценки MLE.   -  person Mothas    schedule 23.04.2014
comment
правильно, я неправильно понял вашу проблему. Быстрым и грязным подходом было бы генерировать данные из вашей гистограммы (скажем, 10000*h[i]) для каждого интервала i, а затем вызывать функции из пакета fitdistr.   -  person Jealie    schedule 23.04.2014


Ответы (1)


Я нашел решение проблемы с синтаксисом. Функция constrOptim оптимизирует только первый аргумент, поэтому она работает, если оптимизированная функция имеет только один аргумент.

   fit.norm<-function(h){
  dist<-function(ab){
    diff2<-function(x)(h(x)-dnorm(x,ab[1], ab[2]))^2
    return(integrate(diff2,0,1)$value)
  }
  res<-constrOptim(theta = c(0.5,1), f = dist,grad=NULL, ui = rbind(c(1,0),c(-1,0),c(0,1)), ci = c(0,-1,0)) 
  return<-list(res)
}
person Mothas    schedule 23.04.2014