Сгенерировать набор значений, который имеет заданную корреляцию с n заданными другими наборами значений.

Вопрос или проблема

Даны списки $L_1, \dots, L_n$ с, скажем, 2000 значениями каждый, и произвольные числа $c_1, \dots, c_n$. Можно ли сгенерировать случайный список из 2000 значений, который имеет корреляцию $c_i$ с $L_i$ для всех $i$?

Да, вы должны взять значения корреляции из каждого списка и применить случайное правило, чтобы получить ожидаемый результат.

Вот пример с тремя списками:

import random
import numpy as np

# Список списков из n значений

L1 = [10, 12, 32, 23, 12, 25, 10, 6, 8]
L2 = [5, 8, 15, 52, 56, 3, 2, 31, 45]
L3 = [21, 18, 6, 9, 26, 15, 9, 16, 26]

n = len(L1)

# Значения корреляции
c1 = 0.9
c2 = 0.2
c3 = 0.1

L = []

for i in range(0, n):

    noise1 = np.random.random()-0.5
    noise2 = np.random.random()-0.5
    noise3 = np.random.random()-0.5

    new_value = ((L1[i]+noise1)*c1 + (L2[i]+noise2)*c2 + (L3[i]+noise3)*c3)/(c1+c2+c3)
    L.append(new_value)

# Корреляции между L и первоначальными списками
corr1 = np.corrcoef(L, L1)[0][1]
corr2 = np.corrcoef(L, L2)[0][1]
corr3 = np.corrcoef(L, L3)[0][1]

print(corr1, corr2,corr3)
print(L)

Примечание: вы можете ограничить случайный выбор значениями, ближайшими к i, если хотите сохранить аналогичный порядок.

Ответ или решение

Создание набора значений с заданной корреляцией с другими наборами данных может показаться сложной задачей, однако с помощью программирования и анализа данных можно достичь желаемого результата. Давайте рассмотрим, как это сделать на примере.

Задача:

У нас есть списки (L_1, L_2, \ldots, L_n), каждый из которых содержит по 2000 значений. Для каждого списка задан коэффициент корреляции (c_i). Необходимо создать случайный список из 2000 значений, который будет иметь заданную корреляцию (c_i) с каждым из соответствующих (L_i).

Шаги решения:

  1. Генерация случайного списка: Наша задача — создать новый список значений, который будет сочетать в себе элементы из исходных списков с добавлением некоторой случайности, чтобы достичь желаемой корреляции.

  2. Вычисление значений с учётом корреляций: Для обеспечения заданной корреляции с каждым из списков, мы применим взвешенное суммирование элементов исходных списков, добавляя небольшую случайную составляющую для придания вариативности.

  3. Использование библиотеки numpy для расчёта корреляции: После создания нового списка, мы проверяем, соответствует ли полученная корреляция заданным условиям, используя функцию np.corrcoef из библиотеки numpy.

Пример кода:

import random
import numpy as np

# Исходные списки
L1 = [10, 12, 32, 23, 12, 25, 10, 6, 8]
L2 = [5, 8, 15, 52, 56, 3, 2, 31, 45]
L3 = [21, 18, 6, 9, 26, 15, 9, 16, 26]

n = len(L1)

# Заданные корреляции
c1 = 0.9
c2 = 0.2
c3 = 0.1

# Новый список
new_list = []

for i in range(n):
    # Добавляем случайную составляющую
    noise1 = np.random.random() - 0.5
    noise2 = np.random.random() - 0.5
    noise3 = np.random.random() - 0.5

    # Вычисляем новое значение на основе средневзвешенной суммы
    new_value = ((L1[i] + noise1)*c1 + (L2[i] + noise2)*c2 + (L3[i] + noise3)*c3) / (c1 + c2 + c3)
    new_list.append(new_value)

# Проверка корреляции
corr1 = np.corrcoef(new_list, L1)[0][1]
corr2 = np.corrcoef(new_list, L2)[0][1]
corr3 = np.corrcoef(new_list, L3)[0][1]

print(corr1, corr2, corr3)
print(new_list)

В этом примере новый список создается путём взвешивания значений из исходных списков (L1, L2) и (L3), а также случайного добавления «шума», чтобы достичь определённого уровня корреляции.

Заключение:

Этот метод позволяет создать новый набор данных, который имеет заданные параметры корреляции с исходными наборами. Он может быть полезен для моделирования, статистического анализа, а также в тех случаях, когда требуется контролировать перекрестное влияние различных переменных.

Оцените материал
Добавить комментарий

Капча загружается...