Линия регрессии LogLog не является прямой с отрицательными значениями журнала? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть график корреляции, где я пытаюсь показать значения в масштабе журнала.Я пытаюсь также показать линию наилучшего соответствия на графике корреляции.

Ниже приведен мой код.

import numpy             as np
import matplotlib        as mpl
import matplotlib.pyplot as plt

from scipy import stats

def loglogplot(seed):
    mpl.rcParams.update({'font.size': 10})
    figh, figw = 1.80118*2, 1.80118*2    
    fig, axes  = plt.subplots(1, 1, figsize=(figh, figw))

    axes.set_xscale('log')
    axes.set_yscale('log')

    np.random.seed(seed)
    x = 10 ** np.random.uniform(-3, 3, size=1000*4)
    y = x * 10 ** np.random.uniform(-1, 1, size=1000*4)
    axes.scatter(x, y, color='black', s=10, alpha=0.1)

    logx = np.log10(x)
    logy = np.log10(y)

    slope, intercept, r_value, p_value, std_err = stats.linregress(logx, logy)
    xps = np.arange(10**-4, 10**4, 1)
    axes.plot(xps, slope * xps + intercept, color='red', lw=2)    

    axes.set_xlim((10**-4, 10**4))
    axes.set_ylim((10**-4, 10**4))

    plt.show()

При запуске с loglogplot(seed=5) я получаю следующее изображение.

LogLog function invocation with seed=5

При запуске с loglogplot(seed=10) я получаю следующее изображение.

LogLog function invocation with seed=5

Я озадачен относительно того, почему, линия регрессии не изображена как прямая линия перед x = 1.Что я делаю не так?

Редактировать: изменено xps = np.arange(10**-4, 10**4, 1) на xps = np.logspace(-4, 4, 1000), и качественно результат не лучше.

Seed = 5 дает:

LogSpace points between -4 and 4 for seed=5

Семя = 10 дает:

LogSpace points between -4 and 4 for seed=10

1 Ответ

0 голосов
/ 08 февраля 2019

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

Вам нужно либо логарифмировать ваши данные, и использовать ихнепосредственно, или вам нужно подумать об отношениях, которые вы фактически смоделировали и (отмените их по мере необходимости).

Подбирая журналы данных, вы подходите к следующему уравнению:

log(y) = m * log(x) + p

Использование математики, которая превращается в:

y = exp(p) * (x ^ m)

Таким образом, ваш код становится:

import numpy
from matplotlib import rcParams, pyplot
from scipy import stats

def loglogplot(seed):
    rcParams.update({'font.size': 10})
    figh, figw = 1.80118*2, 1.80118*2    
    fig, axes  = pyplot.subplots(1, 1, figsize=(figh, figw))

    axes.set_xscale('log')
    axes.set_yscale('log')

    numpy.random.seed(seed)
    x = 10 ** numpy.random.uniform(-3, 3, size=1000*4)
    y = x * 10 ** numpy.random.uniform(-1, 1, size=1000*4)
    axes.scatter(x, y, color='black', s=10, alpha=0.1)

    logx = numpy.log(x)  # <-- doesn't matter that we use natural log
    logy = numpy.log(y)  #     so long as we're consistent

    slope, intercept, r_value, p_value, std_err = stats.linregress(logx, logy)
    xhat = numpy.logspace(-4, 4, 1000)
    yhat = numpy.exp(intercept) * xhat ** slope  # exp -> consistency
    axes.plot(xhat, yhat, color='red', lw=2)    

    axes.set_xlim((10**-4, 10**4))
    axes.set_ylim((10**-4, 10**4))

    return fig

enter image description here

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