Подгоните кумулятивное распределение Вейбулла к массовым данным, передаваемым в R

#r #weibull #fitdistrplus

#r #вейбулл #fitdistrplus

Вопрос:

У меня есть некоторые кумулятивные данные о прохождении массы частиц для материала из щебня, к которым я хотел бы подогнать распределение Вейбулла, используя R. Мне удалось сделать это в Excel с помощью функции WEIBULL.DIST(), используя накопительный переключатель, установленный в TRUE.
Затем я использовал Excel SOLVER для получения альфа- и бета-параметров с использованием RMSE, чтобы получить наилучшее соответствие. Я хотел бы воспроизвести результат в R.

(см. Прилагаемую таблицу здесь)

Данные о частицах и % кумулятивной передачи массы являются следующими векторами

 d.mm <- c(20.001,6.964,4.595,2.297,1.741,1.149,
          0.871,0.574,0.287,0.082,0.062,0.020)
m.pct <- c(1.00,0.97,0.78,0.49,0.27,0.20,0.14,
         0.11,0.07,0.03,0.025,0.00)
 

Это график, к которому я хотел бы подогнать результат Вейбулла:

 plot(log10(d.mm),m.pct)
 

… вычисление функции для вектора значений диаметра в соответствии с таблицей

    d.wei <- c(seq(0.01,0.1,0.01),seq(0.2,1,0.1),seq(2,30,1))
 

Значения, которые я определил как наилучшие для альфа- и бета-версии Weibull в Excel с использованием Solver, равны 1,41 и 3,31 соответственно
Итак, мой вопрос в том, как воспроизвести этот анализ в R (не обязательно решающая часть), но подогнать Weibull к этому набору данных?

Ответ №1:

Нелинейная функция наименьших квадратов nls — это R-версия решателя Execl.

pweibull Будет вычислено распределение вероятностей для распределения Вейбулла. Комментарии в коде должны объяснять пошаговое решение

 d.mm <- c(20.001,6.964,4.595,2.297,1.741,1.149,
          0.871,0.574,0.287,0.082,0.062,0.020)
m.pct <- c(1.00,0.97,0.78,0.49,0.27,0.20,0.14,
           0.11,0.07,0.03,0.025,0.00)

#create data frame store data
df<-data.frame(m.pct, d.mm)

#data for prediction
d.wei <- c(seq(0.01,0.1,0.01),seq(0.2,1,0.1),seq(2,30,1))

#solver (provided starting value for solution)
# alpha is used for shape and beta is used for scale
fit<-nls(m.pct~pweibull(d.mm, shape=alpha, scale=beta), data=df, start=list(alpha=1, beta=2))
print(summary(fit))

#extract out shape and scale
print(summary(fit)$parameters[,1])

#predict new values base on model
y<-predict(fit, newdata=data.frame(d.mm=d.wei))

#Plot comparison
plot(log10(d.mm),m.pct)
lines(log10(d.wei),y, col="blue")
 

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

Комментарии:

1. У меня возникли некоторые проблемы с реализацией этого, когда я изменил некоторые имена полей, пока не понял, что имя поля, используемого в ‘predict’, должно совпадать с именем поля, используемого в dataframe, который использовался для построения модели nls … в этом примере ‘d.mm ‘