LrcMcCamley#
- class mobgap.laterality.LrcMcCamley(
- axis: Literal['is', 'pa', 'combined'] = 'combined',
- smoothing_filter: BaseFilter = cf(ButterworthFilter(cutoff_freq_hz=(0.5, 2), filter_type='bandpass', order=4, zero_phase=True)),
McCamley algorithm for laterality detection of initial contacts.
The McCamley algorithm [1] uses the sign of the angular velocity either yaw (rotation around IC-axis), the roll (rotation around PA-axis), or a combination of both as the distinguishing factor for identifying left and right ICs.
For this the respective signal is filtered (high-pass to remove DC offset and low-pass to remove noise) and the sign at the position of the IC is used to determine the laterality.
The original algorithm uses the yaw signal, but Ullrich et al. [2] showed that a combination of yaw and roll signals can improve the detection accuracy. Further, instead of simple mean subtraction, Ullrich et al. [2] used a Butterworth bandpass filter to smooth the signal.
- Parameters:
- axis
The axis to use for the laterality detection. Can be one of “yaw”, “roll”, or “combined”. For “roll” and “combined” the sign of the “roll” signal is inverted, as it is phase shifted compared to the yaw signal.
- smoothing_filter
The filter to use for smoothing the signal. The filter should be a high-pass filter to remove the DC offset and a low-pass filter to remove noise. So any form of bandpass filter should be suitable.
- Other Parameters:
- data
The raw IMU data passed to the
detectmethod.- ic_list
The list of initial contacts passed to the
detectmethod.- sampling_rate_hz
The sampling rate of the IMU data in Hz passed to the
detectmethod.
- Attributes:
- ic_lr_list_
The predicted left and right foot initial contacts. The dataframe is identical to the input
ic_list, but with thelrcolumn added. Thelrcolumn specifies if the respective IC belongs to the left or the right foot.- smoothed_data_
The smoothed data used for the laterality detection. This might be helpful for debugging or further analysis.
Notes
In the edge case of data == 0, the left side is assumed.
[1]J. McCamley et al., “An enhanced estimate of initial contact and final contact instants of time using lower trunk inertial sensor data,” Gait & posture, 2012, available at: https://www.sciencedirect.com/science/article/pii/S0966636212000707?via%3Dihub
[2] (1,2)Ullrich M, Küderle A, Reggi L, Cereatti A, Eskofier BM, Kluge F. Machine learning-based distinction of left and right foot contacts in lower back inertial sensor gait data. Annu Int Conf IEEE Eng Med Biol Soc. 2021, available at: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9630653
Methods
clone()Create a new instance of the class with all parameters copied over.
get_params([deep])Get parameters for this algorithm.
predict(data, ic_list, *, sampling_rate_hz, **_)Assign a left/right label to each initial contact in the passed data..
self_optimize(data_sequences, ...)Optimize the internal parameters of the algorithm.
set_params(**params)Set the parameters of this Algorithm.
- __init__(
- axis: Literal['is', 'pa', 'combined'] = 'combined',
- smoothing_filter: BaseFilter = cf(ButterworthFilter(cutoff_freq_hz=(0.5, 2), filter_type='bandpass', order=4, zero_phase=True)),
- clone() Self[source]#
Create a new instance of the class with all parameters copied over.
This will create a new instance of the class itself and all nested objects
- get_params(deep: bool = True) dict[str, Any][source]#
Get parameters for this algorithm.
- Parameters:
- deep
Only relevant if object contains nested algorithm objects. If this is the case and deep is True, the params of these nested objects are included in the output using a prefix like
nested_object_name__(Note the two “_” at the end)
- Returns:
- params
Parameter names mapped to their values.
- predict( ) Self[source]#
Assign a left/right label to each initial contact in the passed data..
- Parameters:
- data
The raw IMU of a single sensor. This should usually represent a single gait sequence or walking bout.
- ic_list
The list of initial contacts within the data. The
ic_listis expected to have a columnicwith the indices of the detected initial contacts relative to the start of the passed data.- sampling_rate_hz
The sampling rate of the IMU data in Hz.
- Returns:
- self
The instance of the class with the
ic_lr_list_attribute set to the passed ICs with a new left/right column.
- self_optimize(
- data_sequences: Iterable[DataFrame],
- ic_list_per_sequence: Iterable[DataFrame],
- ref_ic_lr_list_per_sequence: Iterable[DataFrame],
- *,
- sampling_rate_hz: float | Iterable[float],
- **kwargs: Unpack[dict[str, Any]],
Optimize the internal parameters of the algorithm.
This is only relevant for algorithms that have a special internal optimization approach (like ML based algos).
- Parameters:
- data_sequences
A sequence/iterable/list of dataframes, each containing the raw IMU data of a single sensor. Each sequence should usually contain the data of a single gait sequence/walking bout. The optimization will be performed over all sequences combined.
- ic_list_per_sequence
A sequence/iterable/list of gsd-list, each containing the list of detected ics for the respective data sequence. The
ic_listis expected to have a columnicwith the indices of the detected initial contacts relative to the start of the each passed data sequence.- ref_ic_lr_list_per_sequence
A sequence/iterable/list of reference ic_lr_list, each containing the reference left/right initial contacts. They are expected to have the exact same structure as the ic_lists passed as
ic_list_per_sequence, but should contain the ground-truth left/right labels in a additional column calledlr_label. They are used as ground-truth to validate the output of the algorithm during optimization.- sampling_rate_hz
The sampling rate of the IMU data in Hz. This can either be a single float, in case all sequences have the same sampling rate, or a sequence of floats, in case the sampling rate differs between the sequences.
- Returns:
- self
The instance of the class with the internal parameters optimized.