如何从一系列测量中正确确定 Weibull PDF 参数?
How can the Weibull PDF parameters be correctly determined from a series of measurements?
假设我有一系列每小时的测量值,例如平均风速。开始日期和结束日期用于根据时间限制数据。
从这些数据中,我可以计算出各个类别的值的频率。第一类包括 0 和 < 0.5 km/h 之间的所有值。第二个所有值介于 0.5 和 < 1.5 km/h 之间,第三个所有值介于 1.5 和 < 2.5 km/h 之间,依此类推。计算所有值会导致以下总分布:
Category Amount Frequency (in %)
0-1 km/h 42 0.64
1-2 km/h 444 6.78
2-3 km/h 871 13.30
3-4 km/h 1130 17.25
4-5 km/h 1119 17.08
5-6 km/h 934 14.26
6-7 km/h 703 10.73
7-8 km/h 490 7.48
8-9 km/h 351 5.36
9-10 km/ 219 3.34
10-11km/h 143 2.18
11-12 km/h 52 0.79
12-13 km/h 13 0.20
13-14 km/h 15 0.23
14-15 km/h 6 0.09
15-16 km/h 6 0.09
16-17 km/h 4 0.06
17-18 km/h 3 0.05
18-19 km/h 4 0.06
20-21 km/h 2 0.03
如何根据这些值确定 Weibull 比例因子和 Weibull 形状因子(例如 python、可靠性 (?))?
到目前为止,我只将测量系列中的所有单个值传递给 python 可靠性 (Fit_Weibull_2P),从而确定了两个参数。但是,确定的参数似乎不正确(后面曲线画错了)或者我没有正确传递值给Fit_Weibull_2P.
有没有人知道我哪里有错误或者有什么不同的解决方法?也许不是个人价值,而是频率?
这可能对您有帮助,也可能没有帮助,但这是您可以在 R 中完成的方法。
text="
Category Amount 'Frequency (in %)'
'0-1 km/h' 42 0.64
'1-2 km/h' 444 6.78
'2-3 km/h' 871 13.30
'3-4 km/h' 1130 17.25
'4-5 km/h' 1119 17.08
'5-6 km/h' 934 14.26
'6-7 km/h' 703 10.73
'7-8 km/h' 490 7.48
'8-9 km/h' 351 5.36
'9-10 km/h' 219 3.34
'10-11km/h' 143 2.18
'11-12 km/h' 52 0.79
'12-13 km/h' 13 0.20
'13-14 km/h' 15 0.23
'14-15 km/h' 6 0.09
'15-16 km/h' 6 0.09
'16-17 km/h' 4 0.06
'17-18 km/h' 3 0.05
'18-19 km/h' 4 0.06
'20-21 km/h' 2 0.03
"
df=read.table(text=text, header=TRUE)
left=c(0)
right=c(.5)
for (i in 2:20) {
left[i]=i-2+.5
right[i]=i-1+.5
}
df1=mutate(df, left=left, right=right)
library(tidyr)
df1=uncount(df1, Amount)
bins=select(df1, left, right)
fitdistcens(bins, "weibull")
Fitting of the distribution ' weibull ' on censored data by maximum likelihood
Parameters:
estimate
shape 1.953459
scale 5.152375
我不知道你的样本数据是什么,但即使使用分箱数据也能得到很好的近似值。比较 (1) 不使用 floc=0 与 (2) 指定 floc=0 以强制左边界为 0。
import numpy as np
from scipy.stats import weibull_min
x=np.concatenate((np.repeat(.25,42), np.repeat(1, 444), np.repeat(2, 871), np.repeat(3, 1130),
np.repeat(4, 1119), np.repeat(5, 934), np.repeat(6, 703),
np.repeat(7, 490), np.repeat(8, 351), np.repeat(9, 219),
np.repeat(10, 143), np.repeat(11, 52), np.repeat(12, 13),
np.repeat(13, 15), np.repeat(14, 6), np.repeat(15, 6),
np.repeat(16, 4), np.repeat(17, 3), np.repeat(18, 4), [20,20]))
print(weibull_min.fit(x)) #1
(1.8742154858771933, 0.13126151114447493, 4.99670007482597)
print(weibull_min.fit(x, floc=0)) #2
(1.9446899445880135, 0, 5.155845183708194)
这是 interval 删失数据的案例。也就是说,数据点并不完全已知,但已知在某些 window.
中发生过
python 包 surpyval
,发现 here(我是它的作者),是一个很好的方法。
import surpyval as surv
# count vector
n = [42, 444, 871, 1130, 1119, 934, 703, 490, 351, 219, 143, 52, 13, 15, 6, 6, 4, 3, 4, 2]
# interval vector
x = [[l, u] for l, u in zip(range(0, 19), range(1, 20))] + [[20, 21]]
model = surv.Weibull.fit(x=x, n=n)
model
Parametric SurPyval Model
=========================
Distribution : Weibull
Fitted by : MLE
Parameters :
alpha: 5.726746093800134
beta: 2.1824674168785507
您的数据似乎也被右截断了。也就是你没有超过21的观测值。这个也可以加到估计值中。
model = surv.Weibull.fit(x=x, n=n, tr=21)
model
Parametric SurPyval Model
=========================
Distribution : Weibull
Fitted by : MLE
Parameters :
alpha: 5.726746697131137
beta: 2.182465361355963
尽管这不会改变答案。
假设我有一系列每小时的测量值,例如平均风速。开始日期和结束日期用于根据时间限制数据。 从这些数据中,我可以计算出各个类别的值的频率。第一类包括 0 和 < 0.5 km/h 之间的所有值。第二个所有值介于 0.5 和 < 1.5 km/h 之间,第三个所有值介于 1.5 和 < 2.5 km/h 之间,依此类推。计算所有值会导致以下总分布:
Category Amount Frequency (in %)
0-1 km/h 42 0.64
1-2 km/h 444 6.78
2-3 km/h 871 13.30
3-4 km/h 1130 17.25
4-5 km/h 1119 17.08
5-6 km/h 934 14.26
6-7 km/h 703 10.73
7-8 km/h 490 7.48
8-9 km/h 351 5.36
9-10 km/ 219 3.34
10-11km/h 143 2.18
11-12 km/h 52 0.79
12-13 km/h 13 0.20
13-14 km/h 15 0.23
14-15 km/h 6 0.09
15-16 km/h 6 0.09
16-17 km/h 4 0.06
17-18 km/h 3 0.05
18-19 km/h 4 0.06
20-21 km/h 2 0.03
如何根据这些值确定 Weibull 比例因子和 Weibull 形状因子(例如 python、可靠性 (?))?
到目前为止,我只将测量系列中的所有单个值传递给 python 可靠性 (Fit_Weibull_2P),从而确定了两个参数。但是,确定的参数似乎不正确(后面曲线画错了)或者我没有正确传递值给Fit_Weibull_2P.
有没有人知道我哪里有错误或者有什么不同的解决方法?也许不是个人价值,而是频率?
这可能对您有帮助,也可能没有帮助,但这是您可以在 R 中完成的方法。
text="
Category Amount 'Frequency (in %)'
'0-1 km/h' 42 0.64
'1-2 km/h' 444 6.78
'2-3 km/h' 871 13.30
'3-4 km/h' 1130 17.25
'4-5 km/h' 1119 17.08
'5-6 km/h' 934 14.26
'6-7 km/h' 703 10.73
'7-8 km/h' 490 7.48
'8-9 km/h' 351 5.36
'9-10 km/h' 219 3.34
'10-11km/h' 143 2.18
'11-12 km/h' 52 0.79
'12-13 km/h' 13 0.20
'13-14 km/h' 15 0.23
'14-15 km/h' 6 0.09
'15-16 km/h' 6 0.09
'16-17 km/h' 4 0.06
'17-18 km/h' 3 0.05
'18-19 km/h' 4 0.06
'20-21 km/h' 2 0.03
"
df=read.table(text=text, header=TRUE)
left=c(0)
right=c(.5)
for (i in 2:20) {
left[i]=i-2+.5
right[i]=i-1+.5
}
df1=mutate(df, left=left, right=right)
library(tidyr)
df1=uncount(df1, Amount)
bins=select(df1, left, right)
fitdistcens(bins, "weibull")
Fitting of the distribution ' weibull ' on censored data by maximum likelihood
Parameters:
estimate
shape 1.953459
scale 5.152375
我不知道你的样本数据是什么,但即使使用分箱数据也能得到很好的近似值。比较 (1) 不使用 floc=0 与 (2) 指定 floc=0 以强制左边界为 0。
import numpy as np
from scipy.stats import weibull_min
x=np.concatenate((np.repeat(.25,42), np.repeat(1, 444), np.repeat(2, 871), np.repeat(3, 1130),
np.repeat(4, 1119), np.repeat(5, 934), np.repeat(6, 703),
np.repeat(7, 490), np.repeat(8, 351), np.repeat(9, 219),
np.repeat(10, 143), np.repeat(11, 52), np.repeat(12, 13),
np.repeat(13, 15), np.repeat(14, 6), np.repeat(15, 6),
np.repeat(16, 4), np.repeat(17, 3), np.repeat(18, 4), [20,20]))
print(weibull_min.fit(x)) #1
(1.8742154858771933, 0.13126151114447493, 4.99670007482597)
print(weibull_min.fit(x, floc=0)) #2
(1.9446899445880135, 0, 5.155845183708194)
这是 interval 删失数据的案例。也就是说,数据点并不完全已知,但已知在某些 window.
中发生过python 包 surpyval
,发现 here(我是它的作者),是一个很好的方法。
import surpyval as surv
# count vector
n = [42, 444, 871, 1130, 1119, 934, 703, 490, 351, 219, 143, 52, 13, 15, 6, 6, 4, 3, 4, 2]
# interval vector
x = [[l, u] for l, u in zip(range(0, 19), range(1, 20))] + [[20, 21]]
model = surv.Weibull.fit(x=x, n=n)
model
Parametric SurPyval Model
=========================
Distribution : Weibull
Fitted by : MLE
Parameters :
alpha: 5.726746093800134
beta: 2.1824674168785507
您的数据似乎也被右截断了。也就是你没有超过21的观测值。这个也可以加到估计值中。
model = surv.Weibull.fit(x=x, n=n, tr=21)
model
Parametric SurPyval Model
=========================
Distribution : Weibull
Fitted by : MLE
Parameters :
alpha: 5.726746697131137
beta: 2.182465361355963
尽管这不会改变答案。