Я хотел бы визуально оценить, соответствуют ли мои данные определенной функции распределения. Для этого я использую R для создания графика квантилей-квантилей (Q-Q). Функция распределения очень специфична и не входит в стандартный список вероятностных распределений, поэтому я написал собственную R-функцию для ее описания. В приведенном ниже коде он называется «DistFunc» и состоит из отношения двух гамма-функций.
Вкратце, в моем коде я считываю данные из файла «DistributionEstimate.txt», который содержит два столбца. Столбец 1 — это значения x, а столбец 2 — значения y. Переменные «a» и «b» являются параметрами наилучшего соответствия, которые я определил ранее в другой программе, используя метод наименьших квадратов этой функции распределения для данных. Затем я определяю DistFunc и пытаюсь построить график Q-Q с помощью функции qqmath.
Проблема возникает в этот момент. R продолжает выдавать мне множество предупреждений о том, что DistFunc возвращает значения вне диапазона в «gammafn» и не может ничего построить. Это достаточно справедливо, так как я знаю, что функция содержит полюс, близкий к началу координат. Как вы можете видеть в коде, я пытаюсь нормализовать DistFunc, чтобы попытаться преобразовать его в распределение вероятностей (что, я думаю, требуется для использования qqmath?), однако это не помогает.
Кто-нибудь из вас знает, как решить эту проблему — например, используя другую функцию построения графика, не требующую нормализации, или преобразовать ее в псевдовероятностное распределение, не слишком серьезно влияя на результат?
Буду очень благодарен за любую полезную информацию!
install.packages('lattice')
library(lattice)
x<-read.table("C:/DistributionEstimate.txt", colClasses = c(rep("NULL",1),rep("numeric",1)), header = FALSE)
y<-read.table("C:/DistributionEstimate.txt", colClasses = c(rep("numeric",1),rep("NULL",1)), header = FALSE)
x<-sapply(x, as.numeric)
y<-sapply(y, as.numeric)
a<-16359727025.407821410;
b<-198838619.13262583836;
DistFunc <- function(k,ampl=a,stretch=b) {
fdist<-ampl*gamma(k*stretch-1/2)/gamma(k*stretch+1)
fnorm<-fdist/sum(fdist)
}
qqmath(DistFunc(x), y, col="blue", envelope=.95, xlab="Quantiles of the best-fit model", ylab="Quantiles of the data")
abline(0,1, col="red", lwd=2)
grid()
qqmath
? Я не вижу параметрenvelope
. И вы, кажется, передаетеy
в качестве параметраdata
? Вы получаете за это предупреждение? Параметрdistribution=
qqmath предполагает функцию квантиля. Он должен принимать вероятности (0,1) и преобразовывать их в квантили (0,1). Мы понятия не имеем, что находится вC:/DistributionEstimate.txt
, поэтому не можем проверить. Но при таком большом значении растяжения значенияk
должны быть очень, очень маленькими, иначеgamma
не сможет вернуть значение. Дажеgamma(200)
возвращает ошибку. - person MrFlick   schedule 24.05.2014qqPlot
из библиотекиcar
(http://www.inside-r.org/packages/cran/car/docs/qqPlot), который принимает параметрenvelope
. Я переключился наqqmath
последним и забыл его вынуть. Однако Р. не жаловался на это. Я не получаю предупреждения дляy
, но я не понимаю, почему я должен это делать? Хотя я еще новичок и некоторые вещи мне пока не очень понятны. Я загрузил данные сюда: ссылка, если это поможет... - person Mirella   schedule 25.05.2014