Коэффициент корреляции на gnuplot

Я хочу построить данные с помощью функции соответствия: function f(x) = a+b*x**2. После построения у меня есть такой результат:

correlation matrix of the fit parameters:

               m      n      
m               1.000 
n              -0.935  1.000 

Мой вопрос: как я могу найти коэффициент корреляции на gnuplot?


person Mehdi    schedule 19.12.2012    source источник


Ответы (4)


Если вы ищете способ вычислить коэффициент корреляции, как определено на этой странице, вы не повезло с использованием gnuplot, как описано в этом ветка групп Google.

Есть много других инструментов для расчета коэффициентов корреляции, например numpy.

person andyras    schedule 21.12.2012

Вы можете использовать команду stats в gnuplot, синтаксис которой аналогичен команде plot:

stats "file.dat" using 2:(f($2)) name "A"

Коэффициент корреляции будет сохранен в переменной A_correlation. (Без указания имени это будет STATS_correlation.) Вы можете использовать его впоследствии для построения ваших данных или просто распечатать на экране с помощью команды set label:

set label 1 sprintf("r = %4.2f",A_correlation) at graph 0.1, graph 0.85

Дополнительную информацию о команде stats можно найти в документации по gnuplot.

person Nikita Rokotyan    schedule 04.08.2013

Хотя прямого решения этой проблемы нет, возможен обходной путь. Я проиллюстрирую это с помощью python / numpy. Во-первых, часть скрипта gnuplot, которая генерирует соответствие и соединяется со скриптом Python:

    file = "my_data.tsv"
    f(x)=a+b*(x)
    fit f(x) file using 2:3 via a,b
    r = system(sprintf("python correlation.py %s",file)) 
    ti = sprintf("y = %.2f + %.2fx (r = %s)", a, b, r)
    plot \
      file using 2:3 notitle,\
      f(x) title ti

Это запускает correlation.py для получения корреляции 'r' в строковом формате. Он использует 'r' для создания заголовка подходящей линии. Затем correlation.py:

    from numpy import genfromtxt
    from numpy import corrcoef
    import sys
    data = genfromtxt(sys.argv[1], delimiter='\t')
    r = corrcoef(data[1:,1],data[1:,2])[0,1]
    print("%.3f" % r).lstrip('0')

Здесь предполагается, что первая строка является строкой заголовка. Кроме того, столбцы, для которых требуется вычислить корреляцию, теперь жестко запрограммированы на nr. 1 и 2. Конечно, обе настройки можно изменить и превратить в аргументы.

В результате получается заголовок подходящей строки (для личного примера):

y = 2.15 + 1.58x (r = .592)
person Frans    schedule 23.03.2013

Поскольку вы, вероятно, используете функцию соответствия, вы можете сначала обратиться к этой ссылке , чтобы получить значения R2. Ссылка использует определенные существующие переменные, такие как FIT_WSSR, FIT_NDF, для вычисления значения R2. Код для R2 указан как:

SST = FIT_WSSR/(FIT_NDF+1)
SSE=FIT_WSSR/(FIT_NDF)
SSR=SST-SSE
R2=SSR/SST

Следующим шагом будет отображение значений R ^ 2 на графике. Этого можно добиться с помощью кода:

set label 1 sprintf("r = %f",R2) at graph 0.7, graph 0.7

person Sai Avinash Sattiraju    schedule 19.07.2018
comment
Я думаю, вы слишком сильно сократили сообщение в блоге. Расчет SST должен происходить после специальной подгонки (fit m 'your data file' using 1:2 via m, чтобы получить среднее значение), а не после обычной подгонки, как другие назначения. (Кроме того, я думаю, что вычисление SSE должно делиться на FIT_NDF + 2 вместо FIT_NDF, но эта ошибка также присутствует в сообщении в блоге.) - person Lucas Werkmeister; 14.09.2018
comment
В первую очередь, R2 обычно используется скорее как качественный, чем количественный инструмент. Коэффициент R2 0,88 практически аналогичен 0,82 для многих приложений. Но мне бы хотелось узнать больше об этой логике FIT_NDF + 2, так как лучше быть точным. Также не могли бы вы объяснить эту терминологию специальной и общей подгонки. Кроме того, для ясности, это значение R * 2 для правильной подгонки. Поскольку эта группа Google (groups. google.com/forum/?fromgroups=#!topic/) утверждает, что мы не можем рассчитать R * 2 с помощью gnuplot. - person Sai Avinash Sattiraju; 17.09.2018