Проблема:
Переключение знаков: знаки факторных нагрузок произвольно меняются между бутстреп-выборками, что затрудняет агрегирование результатов.
Обмен факторами: факторы 3 и 4 часто меняют местами между бутстрапами, что приводит к несовпадающим назначениям.
Проблемы агрегирования. Эти несоответствия приводят к бимодальному распределению значений нагрузки при построении гистограмм по бутстрапам, что указывает на несовпадение.
Подходы, которые я пробовал:
Выравнивание знаков по ссылке:
Использовался первый образец начальной загрузки в качестве эталона.
Перевернуты знаки факторов в последующих бутстрапах, если более половины знаки различались.
Проблема: Не удалось полностью решить проблему; факторы по-прежнему были присвоены неправильно.
Венгерский алгоритм с затратами на основе корреляции:
Рассчитаны абсолютные корреляции между бутстрап-факторами и эталонными факторами.
Используется отрицательные абсолютные корреляции как затраты на задачу назначения.
Скорректированы знаки в зависимости от знака корреляции.
Проблема: факторы 3 и 4 по-прежнему перепутаны в программах начальной загрузки.
Факторы кластеризации:
Собраны все факторы из всех бутстрапов.
Стандартизированы и кластеризованы с использованием кластеризации K-Means.
Переупорядочены факторы на основе назначений кластера.Скорректированы знаки для совмещения с центрами кластеров.
Проблема: факторы остались несовмещенными; кластеризация не привела к согласованному назначению факторов.
Фрагмент кода:
Вот последняя версия моей функции post_process, использующая подход кластеризации:
Код: Выделить всё
def post_process(results, sample_id, data):
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# Number of factors
n_factors = results['loadings'][0].shape[1]
# Collect all factors from all bootstraps
all_loadings = []
for idx in range(len(results['loadings'])):
loadings = results['loadings'][idx].copy()
# Ensure consistent sign (e.g., largest absolute loading is positive)
for i in range(loadings.shape[1]):
max_abs_index = np.argmax(np.abs(loadings[:, i]))
if loadings[max_abs_index, i] < 0:
loadings[:, i] *= -1
# Transpose to have factors as rows
all_loadings.append(loadings.T)
# Stack all factors
all_loadings = np.vstack(all_loadings)
# Standardize the factors
scaler = StandardScaler()
all_loadings_scaled = scaler.fit_transform(all_loadings)
# Perform clustering
kmeans = KMeans(n_clusters=n_factors, random_state=0)
cluster_labels = kmeans.fit_predict(all_loadings_scaled)
# Assign cluster labels back to factors
factor_idx = 0
for idx in range(len(results['loadings'])):
loadings = results['loadings'][idx]
scores = results['scores'][idx]
n_factors_in_sample = loadings.shape[1]
# Get cluster labels for the current sample's factors
cluster_ids = cluster_labels[factor_idx:factor_idx + n_factors_in_sample]
factor_idx += n_factors_in_sample
# Map clusters to consistent order
unique_clusters = np.unique(cluster_ids)
cluster_order = {cluster: i for i, cluster in enumerate(sorted(unique_clusters))}
ordered_indices = np.array([cluster_order[cluster_id] for cluster_id in cluster_ids])
# Reorder factors based on cluster labels
order = np.argsort(ordered_indices)
results['loadings'][idx] = loadings[:, order]
results['scores'][idx] = scores[:, order]
# Adjust signs to align with cluster centers
for i in range(n_factors_in_sample):
cluster_center = kmeans.cluster_centers_[cluster_ids[order[i]]]
loading = results['loadings'][idx][:, i]
if np.dot(loading, cluster_center) < 0:
results['loadings'][idx][:, i] *= -1
results['scores'][idx][:, i] *= -1
# Aggregation code follows...
# [Omitted for brevity]
Несмотря на эти усилия, факторы 3 и 4 по-прежнему меняются местами и не совпадают в разных бутстрапах.
Гистограммы значения нагрузки для этих факторов показывают бимодальное распределение.
Это говорит о том, что текущие методы не эффективно решают проблемы выравнивания факторов и смены знаков.
Мой вопрос:
Как я могу эффективно согласовать факторы в бутстреп-выборках в PFA, чтобы избежать переворота знаков и замены факторов, особенно когда факторы схожи и имеют тенденцию смешиваться (например, факторы 3 и 4 в моем случае)?
Существуют ли альтернативные методы или лучшие практики для обработки выравнивания факторов и смены знаков в бутстреп-факторном анализе?
Как я могу гарантировать, что каждый фактор последовательно назначается и подписывается в бутстреп-выборках для точного агрегирования?Есть ли способ справиться с факторами, которые по своей природе нестабильны или сильно коррелированы?
Любые идеи, предложения или примеры того, как решить эту проблему, будем очень признательны!
Подробнее здесь: https://stackoverflow.com/questions/789 ... s-due-to-s