2024-10-15 00:22:25 +03:00
|
|
|
import numpy as np
|
|
|
|
from app.zadachi.zadacha2 import zadacha2
|
|
|
|
from app.zadachi.zadacha1 import zadacha1
|
|
|
|
|
|
|
|
class zadacha5:
|
|
|
|
def __init__(self):
|
|
|
|
self.z1 = zadacha1()
|
|
|
|
self.z2 = zadacha2()
|
|
|
|
|
|
|
|
def calculate_spearman_rank_test(self):
|
|
|
|
"""
|
|
|
|
Выполняет тест ранговой корреляции Спирмена для проверки взаимосвязи между X и Y.
|
|
|
|
:return: коэффициент корреляции Спирмена и p-value
|
|
|
|
"""
|
|
|
|
# Генерируем данные
|
|
|
|
X, Y = self.z1.create_lin_array()
|
|
|
|
|
|
|
|
# Вычисляем ранги
|
|
|
|
X_ranks = np.argsort(np.argsort(X))
|
|
|
|
Y_ranks = np.argsort(np.argsort(Y))
|
|
|
|
|
|
|
|
# Вычисляем разницу рангов
|
|
|
|
diff_ranks = X_ranks - Y_ranks
|
|
|
|
|
|
|
|
# Числитель формулы Спирмена
|
|
|
|
numerator = 6 * np.sum(diff_ranks**2)
|
|
|
|
|
|
|
|
# Количество наблюдений
|
|
|
|
n = len(X)
|
|
|
|
|
|
|
|
# Коэффициент корреляции Спирмена
|
|
|
|
spearman_coef = 1 - numerator / (n * (n**2 - 1))
|
|
|
|
|
|
|
|
# Оценка значимости результата (p-value) не рассчитывается вручную здесь, но коэффициент корреляции интерпретируется.
|
|
|
|
print(f'Коэффициент корреляции Спирмена: {spearman_coef:.3f}')
|
|
|
|
|
|
|
|
# Интерпретация результата
|
|
|
|
if np.abs(spearman_coef) > 0.5:
|
|
|
|
print("Существует значимая взаимосвязь между X и Y.")
|
|
|
|
else:
|
|
|
|
print("Взаимосвязь между X и Y слабая или отсутствует.")
|
|
|
|
|
|
|
|
def calculate_gq_test(self):
|
|
|
|
"""
|
|
|
|
Выполняет тест Голдфелда-Квандта для проверки гомоскедастичности.
|
|
|
|
:return: значение статистики F и результат теста
|
|
|
|
"""
|
|
|
|
# Генерируем данные
|
|
|
|
X, Y = self.z1.create_lin_array()
|
|
|
|
|
|
|
|
# Рассчитываем коэффициенты регрессии
|
|
|
|
b0, b1 = self.z2.calculate_coefficients(X, Y)
|
|
|
|
|
|
|
|
# Вычисляем остатки
|
|
|
|
residuals = Y - self.z2.predict(X, b0, b1)
|
|
|
|
|
|
|
|
# Сортируем данные по X для выполнения теста
|
|
|
|
sorted_indices = np.argsort(X)
|
|
|
|
residuals_sorted = residuals[sorted_indices]
|
|
|
|
|
|
|
|
# Разбиваем данные на две части
|
|
|
|
split_index = len(residuals_sorted) // 2
|
|
|
|
residuals_low = residuals_sorted[:split_index]
|
|
|
|
residuals_high = residuals_sorted[split_index:]
|
|
|
|
|
|
|
|
# Вычисляем средние квадраты остатков
|
|
|
|
var_low = np.var(residuals_low, ddof=1)
|
|
|
|
var_high = np.var(residuals_high, ddof=1)
|
|
|
|
|
|
|
|
# Тестовая статистика F
|
|
|
|
f_stat = var_high / var_low
|
|
|
|
|
|
|
|
print(f'Статистика F: {f_stat:.3f}')
|
|
|
|
|
|
|
|
# Интерпретация результата
|
|
|
|
if f_stat > 2 or f_stat < 0.5:
|
|
|
|
print("Остатки не гомоскедастичны. Условие линейной регрессии нарушено.")
|
|
|
|
else:
|
|
|
|
print("Остатки гомоскедастичны. Условие линейной регрессии выполнено.")
|