Весовые векторы
При статистических расчетах элементам выборки часто назначаются веса. С целью упростить использование весовых векторов введен представляющий их абстрактный тип AbstractWeights
. Он дает два преимущества.
-
Отдельный тип
AbstractWeights
позволяет выделить весовой вектор среди других векторов во входных аргументах как имеющий особую роль. -
В статистических функциях, использующих веса, зачастую в различных целях требуется сумма весов. В весовом векторе уже хранится сумма весов, так что ее не нужно вычислять каждый раз.
|
-
Во входном векторе хранится сумма весов, которая вычисляется во время его создания. Если сумма вычислена предварительно, ее можно передать в конструктор во втором аргументе, чтобы сэкономить время.
Реализации
Доступно несколько типов статистических весов, которые являются подтипами типа AbstractWeights
. Выбор весов влияет на то, как производится корректировка смещения рядом методов. Дополнительные сведения см. в docstring методов var
, std
и cov
.
AnalyticWeights
Аналитические веса описывают неслучайную относительную значимость (обычно от 0 до 1) каждого наблюдения. Они также могут называться «веса надежности», «веса точности» или «веса обратной дисперсии». Как правило, они применяются в том случае, когда взвешиваемые наблюдения представляют собой совокупные значения (например, средние) с различной дисперсией.
w = AnalyticWeights([0.2, 0.1, 0.3])
w = aweights([0.2, 0.1, 0.3])
FrequencyWeights
Частотные веса описывают то, сколько раз (или с какой частотой) отмечалось каждое наблюдение. Они также могут называться «веса повторений» или «веса репликации».
w = FrequencyWeights([2, 1, 3])
w = fweights([2, 1, 3])
ProbabilityWeights
Веса вероятности представляют величину, обратную вероятности выборки для каждого наблюдения, и обеспечивают механизм коррекции на случай недостаточной или избыточной выборки определенных групп из совокупности. Они также могут называться «веса выборки».
w = ProbabilityWeights([0.2, 0.1, 0.3])
w = pweights([0.2, 0.1, 0.3])
UnitWeights
Единичные веса — это особый случай: всем наблюдениям присваивается вес, равный 1
. Использование таких весов равносильно вычислению невзвешенной статистики.
В частности, этот тип может использоваться при реализации алгоритма, предполагающего запись только взвешенного варианта. В этом случае невзвешенный вариант можно получить путем передачи объекта UnitWeights
. Это очень эффективный подход, так как для весового вектора не приходится выделять память.
w = uweights(3)
w = uweights(Float64, 3)
Weights
Тип Weights
описывает универсальный весовой вектор, который поддерживает не все возможные операции FrequencyWeights
, AnalyticWeights
, ProbabilityWeights
и UnitWeights
.
w = Weights([1., 2., 3.])
w = weights([1., 2., 3.])
Экспоненциальные веса: eweights
Экспоненциальные веса — это распространенная форма временных весов: прошлым наблюдениям назначаются экспоненциально убывающие веса.
Если t
— вектор временных весов, то для каждого индекса i
вес вычисляется следующим образом.
— это коэффициент сглаживания или параметр скорости, отвечающий условию . При приближении этого значения к 0 итоговые веса будут почти равны, а при его приближении к 1 конечным элементам вектора будут присваиваться большие веса.
Например, приведенный ниже вызов генерирует экспоненциальные веса для десяти наблюдений с .
julia> eweights(1:10, 0.3)
10-element Weights{Float64,Float64,Array{Float64,1}}:
0.3
0.42857142857142855
0.6122448979591837
0.8746355685131197
1.249479383590171
1.7849705479859588
2.549957925694227
3.642797036706039
5.203995766722913
7.434279666747019
Если просто передать количество наблюдений n
, это равносильно передаче 1:n
.
julia> eweights(10, 0.3)
10-element Weights{Float64,Float64,Array{Float64,1}}:
0.3
0.42857142857142855
0.6122448979591837
0.8746355685131197
1.249479383590171
1.7849705479859588
2.549957925694227
3.642797036706039
5.203995766722913
7.434279666747019
Наконец, экспоненциальные веса можно генерировать на основе произвольного подмножества меток времени из более широкого диапазона.
julia> t
2019-01-01T01:00:00:2 hours:2019-01-01T05:00:00
julia> r
2019-01-01T01:00:00:1 hour:2019-01-02T01:00:00
julia> eweights(t, r, 0.3)
3-element Weights{Float64,Float64,Array{Float64,1}}:
0.3
0.6122448979591837
1.249479383590171
ПРИМЕЧАНИЕ. Это эквивалентно вызову eweights(something.(indexin(t, r)), 0.3)
, который означает, что для каждого значения в t
возвращается его индекс в r
. Так как indexin
возвращает nothing
, если в r
нет соответствующего значения из t
, мы используем something
, чтобы устранить такую возможность.
Методы
AbstractWeights
реализует следующие методы:
eltype length isempty values sum
Доступны следующие конструкторы:
#
StatsBase.AnalyticWeights
— Type
AnalyticWeights(vs, wsum=sum(vs))
Создает вектор AnalyticWeights
со значениями весов vs
. Предварительно вычисленную сумму можно указать в wsum
.
Аналитические веса описывают неслучайную относительную значимость (обычно от 0 до 1) каждого наблюдения. Они также могут называться «веса надежности», «веса точности» или «веса обратной дисперсии». Как правило, они применяются в том случае, когда взвешиваемые наблюдения представляют собой совокупные значения (например, средние) с различной дисперсией.
#
StatsBase.FrequencyWeights
— Type
FrequencyWeights(vs, wsum=sum(vs))
Создает вектор FrequencyWeights
со значениями весов vs
. Предварительно вычисленную сумму можно указать в wsum
.
Частотные веса описывают то, сколько раз (или с какой частотой) отмечалось каждое наблюдение. Они также могут называться «веса повторений» или «веса репликации».
#
StatsBase.ProbabilityWeights
— Type
ProbabilityWeights(vs, wsum=sum(vs))
Создает вектор ProbabilityWeights
со значениями весов vs
. Предварительно вычисленную сумму можно указать в wsum
.
Веса вероятности представляют величину, обратную вероятности выборки для каждого наблюдения, и обеспечивают механизм коррекции на случай недостаточной или избыточной выборки определенных групп из совокупности. Они также могут называться «веса выборки».
#
StatsBase.UnitWeights
— Type
UnitWeights{T}(s)
Создает вектор UnitWeights
длиной s
с элементами весов типа T
. Все элементы весов тождественно равны нулю.
#
StatsBase.Weights
— Type
Weights(vs, wsum=sum(vs))
Создает вектор Weights
со значениями весов vs
. Предварительно вычисленную сумму можно указать в wsum
.
Тип Weights
описывает универсальный весовой вектор, который поддерживает не все возможные операции FrequencyWeights
, AnalyticWeights
и ProbabilityWeights
.
#
StatsBase.aweights
— Function
aweights(vs)
Создает вектор AnalyticWeights
на основе массива vs
. Дополнительные сведения см. в документации по AnalyticWeights
.
#
StatsBase.fweights
— Function
fweights(vs)
Создает вектор FrequencyWeights
на основе заданного массива. Дополнительные сведения см. в документации по FrequencyWeights
.
#
StatsBase.pweights
— Function
pweights(vs)
Создает вектор ProbabilityWeights
на основе заданного массива. Дополнительные сведения см. в документации по ProbabilityWeights
.
#
StatsBase.eweights
— Function
eweights(t::AbstractVector{<:Integer}, λ::Real; scale=false)
eweights(t::AbstractVector{T}, r::StepRange{T}, λ::Real; scale=false) where T
eweights(n::Integer, λ::Real; scale=false)
Создает вектор Weights
, в котором прошлым наблюдениям назначаются экспоненциально убывающие веса (более высокие целочисленные значения i
в t
). Целочисленное значение n
представляет число учитываемых прошлых наблюдений. n
по умолчанию имеет значение maximum(t) - minimum(t) + 1
, если передан только аргумент t
и элементы являются целочисленными, или значение length(r)
, если также передан диапазон надмножества r
. Если вместо t
явным образом передан аргумент n
, по умолчанию t
равно 1:n
.
Если аргумент scale
имеет значение true
, то для каждого элемента i
в t
значение веса вычисляется следующим образом:
Если аргумент scale
имеет значение false
, то каждое значение вычисляется следующим образом:
Аргументы
-
t::AbstractVector
: временные индексы или метки времени. -
r::StepRange
: более широкий диапазон, используемый при генерировании весов на основе подмножества меток времени. -
n::Integer
: число учитываемых прошлых событий. -
λ::Real
: коэффициент сглаживания или параметр скорости, отвечающий условию . При приближении этого значения к 0 итоговые веса будут почти равны, а при его приближении к 1 конечным элементам вектора будут присваиваться большие веса.
Именованные аргументы
-
scale::Bool
: веса возвращаются масштабированными в интервале от 0 до 1 (значение по умолчанию — false).
Примеры
julia> eweights(1:10, 0.3; scale=true)
10-element Weights{Float64,Float64,Array{Float64,1}}:
0.04035360699999998
0.05764800999999997
0.08235429999999996
0.11764899999999996
0.16806999999999994
0.24009999999999995
0.3429999999999999
0.48999999999999994
0.7
1.0
Ссылки
-
https://en.wikipedia.org/wiki/Movingaverage#Exponentialmoving_average
#
StatsBase.uweights
— Function
uweights(s::Integer)
uweights(::Type{T}, s::Integer) where T<:Real
Создает вектор UnitWeights
длиной s
с элементами весов типа T
. Все элементы весов тождественно равны нулю.
Примеры
julia> uweights(3)
3-element UnitWeights{Int64}:
1
1
1
julia> uweights(Float64, 3)
3-element UnitWeights{Float64}:
1.0
1.0
1.0