Panel Operations
DiffinDiffsBase.PanelStructure
— TypePanelStructure{R<:Signed, IP<:AbstractVector, TP<:AbstractVector}
Panel data structure defined by unique combinations of unit ids and time periods. It contains the information required for certain operations such as lag
and diff
. See also setpanel
.
Fields
refs::Vector{R}
: reference values that allow obtaining time gaps by taking differences.invrefs::Dict{R, Int}
: inverse map fromrefs
to indices.idpool::IP
: unique unit ids.timepool::TP
: sorted unique time periods.laginds::Dict{Int, Vector{Int}}
: a map from lag distances to vectors of indices of lagged values.
Base.diff
— Methoddiff(panel::PanelStructure, v::AbstractArray; kwargs...)
Return the differences of v
within observations for each unit in panel
. By default, it calculates the first differences. See also diff!
.
Keywords
order::Integer=1
: the order of differences to be taken.l::Integer=1
: the time interval between each pair of observations.default=missing
: default values for indices where the differences do not exist.
DiffinDiffsBase.aligntime
— Methodaligntime(col::AbstractArray, time::ScaledArrOrSub)
aligntime(col::AbstractArray, time::RotatingTimeArray)
aligntime(data, colname::Union{Symbol,Integer}, timename::Union{Symbol,Integer})
Convert a column of time values col
to a ScaledArray
with a pool
that has the same first element and step size as the pool
from the ScaledArray
time
. If time
is a RotatingTimeArray
with the time
field being a ScaledArray
, the returned array is also a RotatingTimeArray
with the time
field being the converted ScaledArray
. Alternative, the arrays may be specified with a Tables.jl
-compatible data
table and column indices colname
and timename
. See also settime
.
This is useful for representing all discretized time periods with the same scale so that the underlying reference values returned by DataAPI.refarray
can be directly comparable across the columns.
DiffinDiffsBase.cellrows
— Methodcellrows(cols::VecColumnTable, refrows::IdDict)
A utility function for processing the object refrows
returned by findcell
. Unique row values from cols
corresponding to the keys in refrows
are sorted lexicographically and stored as rows in a new VecColumnTable
. Groups of row indices from the values of refrows
are permuted to match the order of row values and collected in a Vector
.
Returns
cells::VecColumnTable
: unique row values from columns incols
.rows::Vector{Vector{Int}}
: row indices for each combination.
DiffinDiffsBase.diff!
— Methoddiff!(dest::AbstractArray, panel::PanelStructure, v::AbstractArray; kwargs...)
Take the differences of v
within observations for each unit in panel
and store the result in dest
. By default, it calculates the first differences. See also diff
.
Keywords
order::Integer=1
: the order of differences to be taken.l::Integer=1
: the time interval between each pair of observations.default=missing
: default values for indices where the differences do not exist.
DiffinDiffsBase.findcell
— Methodfindcell(cols::VecColumnTable)
findcell(names, data, esample=Colon())
Group the row indices of a collection of data columns so that the combination of row values from these columns are the same within each group.
Instead of directly providing the relevant portions of columns as VecColumnTable
`, one may specify the
namesof columns from
dataof any
Tables.jl-compatible table type over selected rows indicated by
esample. Note that unless
esamplecovers all rows of
data, the row indices are those for the subsample selected based on
esamplerather than those for the full
data`.
Returns
IdDict{Tuple, Vector{Int}}
: a map from unique row values to row indices.
DiffinDiffsBase.findlag!
— Functionfindlag!(panel::PanelStructure, l::Integer=1)
Construct a vector of indices of the l
th lagged values for all id-time combinations of panel
and save the result in panel.laginds
. If a lagged value does not exist, its index is filled with 0. See also ilag!
.
DiffinDiffsBase.findlead!
— Functionfindlead!(panel::PanelStructure, l::Integer=1)
Construct a vector of indices of the l
th lead values for all id-time combinations of panel
and save the result in panel.laginds
. If a lead value does not exist, its index is filled with 0. See also ilead!
.
DiffinDiffsBase.ilag!
— FunctionDiffinDiffsBase.ilead!
— FunctionDiffinDiffsBase.setpanel
— Methodsetpanel(data, idname, timename; step, reftype, rotation)
setpanel(id::AbstractArray, time::AbstractArray; step, reftype, rotation)
Declare a PanelStructure
which is required for certain operations such as lag
and diff
. Unit IDs and time values can be provided either as a table containing the relevant columns or as arrays. timestep
must be specified unless the time
array is a ScaledArray
that is returned by settime
.
Arguments
data
: aTables.jl
-compatible data table.idname::Union{Symbol,Integer}
: the name of the column indata
that contains unit IDs.timename::Union{Symbol,Integer}
: the name of the column indata
that contains time values.id::AbstractArray
: the array containing unit IDs (only needed for the alternative method).time::AbstractArray
: the array containing time values (only needed for the alternative method).
Keywords
step=nothing
: the length of each time interval; trystep=one(eltype(time))
if not specified.reftype::Type{<:Signed}=Int32
: the element type of the reference values forPanelStructure
.rotation=nothing
: rotation groups in a rotating sampling design; useRotatingTimeValue
s as reference values.
If the underlying data used to create the PanelStructure
are modified. The changes will not be reflected in the existing instances of PanelStructure
. A new instance needs to be created with setpanel
.
DiffinDiffsBase.settime
— Functionsettime(time::AbstractArray, step; start, stop, reftype, rotation)
Convert a column of time values to a ScaledArray
for representing discretized time periods of uniform length. If rotation
is specified (time values belong to multiple rotation groups), a RotatingTimeArray
is returned with the time
field being a ScaledArray
. The returned array ensures well-defined time intervals for operations involving relative time (such as lag
and diff
). See also aligntime
.
Arguments
time::AbstractArray
: the array containing time values.step=nothing
: the length of each time interval; trystep=one(eltype(time))
if not specified.
Keywords
start=nothing
: the first element of thepool
of the returnedScaledArray
.stop=nothing
: the last element of thepool
of the returnedScaledArray
.reftype::Type{<:Signed}=Int32
: the element type of the reference values for theScaledArray
.rotation=nothing
: rotation groups in a rotating sampling design.
ShiftedArrays.lag
— FunctionShiftedArrays.lead
— FunctionDiffinDiffsBase.RotatingTimeArray
— TypeRotatingTimeArray{T<:RotatingTimeValue,N,C,I} <: AbstractArray{T,N}
Array type for RotatingTimeValue
s that stores the field values rotation
and time
in two arrays for efficiency. The two arrays that hold the field values for all elements can be accessed as properties.
DiffinDiffsBase.RotatingTimeArray
— MethodRotatingTimeArray(rotation::AbstractArray, time::AbstractArray)
Construct a RotatingTimeValue
from arrays of rotation
and time
.
DiffinDiffsBase.RotatingTimeValue
— TypeRotatingTimeValue{R, T}
A wrapper around a time value for distinguishing potentially different rotation group it could belong to in a rotating sampling design. See also rotatingtime
and settime
.
Fields
rotation::R
: a rotation group in a rotating sampling design.time::T
: a time value belonged to the rotation group.
DiffinDiffsBase.rotatingtime
— Methodrotatingtime(rotation, time)
Construct RotatingTimeValue
s from rotation
and time
. This method simply broadcasts the default constructor over the arguments.