Рассчитать линейную процентную разницу - PullRequest
1 голос
/ 24 марта 2020

У меня есть два связанных набора данных, один из которых может быть немного ниже 0.

Я пытаюсь вычислить «линейную» процентную разницу между двумя.

Я написал пример кода: perc [1] - правильный метод процентного отношения, однако в двух последних случаях процентные различия не являются «линейными» для обеих сторон (ie -87 по сравнению с 700) - мне нужно, чтобы они были равны или иметь некоторую линейность в своих вычислениях, тогда как последние три метода являются линейными, я думаю. Мне нравится perc [3], так как это просто абсолютное различие и усиление, но отчасти без единиц. Может быть, [4] или [5] является наиболее точным для этого варианта использования, используя среднее значение двух в качестве знаменателя?

1, 8: [12.5, -87.5, 700.0, -700, -155.55555555555557, 155.55555555555557]
8, 1: [800.0, 700.0, -87.5, 700, 155.55555555555557, -155.55555555555557]

Статистика не является моей сильной стороной. Может ли кто-нибудь дать рациональное объяснение, почему я должен использовать [4] или [5]. Я знаю, что 0,1,2 и 3, вероятно, не правильный выбор здесь

import numpy as np
import matplotlib.pyplot as plt

def perc_calc(x,y):
    perc0=(x/y)*100 #Original one i used but is non-linear
    perc1=((x-y)/(y))*100   #Proper % method but still nonlinear
    perc2=((y-x)/x)*100    #Depends if use x or y
    perc3=(x-y)*100       #Just amplifying the real difference
    perc4=(x-y)/((x+y)/2)*100  #Difference by the mean 
    perc5=(y-x)/((x+y)/2)*100  #Opposite difference by the mean
    return [perc0,perc1,perc2,perc3,perc4,perc5]


x=np.random.uniform(-0.005, 1, size=600)
y=np.random.uniform(0.005,1,size=600)

plt.plot(perc_calc(x,y)[3])
plt.show()

plt.plot(perc_calc(x,y)[4])
plt.show()

def example(x,y):
    print(str(x)+', '+str(y)+': '+str(perc_calc(x,y)))
#Example Cases:
example(5,10)
example(-1,10)
example(1,8)
example(8,1)

1 Ответ

1 голос
/ 24 марта 2020

Ссылка на эту статью Википедии , относительный процент , как правило, имеет вид

| x ​​- y | / | f (x, y) |

Абсолютное значение в | x - y | можно удалить, если у вас есть контрольная точка, чтобы получить отрицательные проценты. Если это не имеет смысла для вас, вы должны сохранить его.

Функция | f (x, y) | это то, что обычно называют коэффициент масштабирования . Здесь вы можете выбрать один из множества вариантов, и это зависит от приложения.

Вы можете выбрать просто f (x, y) = y, как вы это делали в (1). Обычно это делается при сравнении экспериментальных и теоретических значений , скажем, после измерения в каком-то эксперименте; или когда измеряет изменение относительно прошлого состояния . Но обратите внимание, что ему нужна контрольная точка (теоретическое значение или значение до того, как было сделано изменение), и он не будет иметь искомого свойства "линейность", поскольку ваши коэффициенты масштабирования изменяются при поменять местами x и y (1/2 против 1, если мы используем 1 и 2). Это связано с тем, что для значения 2 внезапное изменение на 10 означает увеличение на 400%, а 10, превращающееся в 2, означает уменьшение на 80%.

Так что вам нужна функция f, которая не меняется на поменять параметры. В математике это известно как симметрия c функция . Многие примеры приведены в статье, на которую ссылаются до . Я предлагаю (| x | + | y ​​|) / 2, но попробуйте другие, чтобы увидеть, что имеет больше смысла.

    perc6 = abs(x-y) / ((abs(x)+abs(y)) / 2) * 100

Чтобы проверить на графике, попробуйте зафиксировать значение для y, скажем, 10, и сделайте диаграмму рассеяния x против perc_calc(x, 10)[6].

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