【问题标题】:Correlation coefficient on gnuplotgnuplot上的相关系数
【发布时间】:2012-12-07 02:30:33
【问题描述】:

我想使用拟合函数绘制数据:function f(x) = a+b*x**2。绘制后我有这个结果:

correlation matrix of the fit parameters:

               m      n      
m               1.000 
n              -0.935  1.000 

我的问题是:如何在 gnuplot 上找到相关系数?

【问题讨论】:

    标签: gnuplot regression correlation


    【解决方案1】:

    您可以在gnuplot中使用stats命令,其语法类似于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

    您可以在gnuplot documentation 中找到有关stats 命令的更多信息。

    【讨论】:

      【解决方案2】:

      由于您可能正在使用 fit 函数,因此您可以先参考此 link 以得出 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

      【讨论】:

      • 我认为您对博客文章的缩写太多了。 SST 计算需要在特殊拟合之后进行(fit m 'your data file' using 1:2 via m,以获得平均值),而不是像其他分配一样在常规拟合之后进行。 (另外,我认为 SSE 计算需要除以 FIT_NDF + 2 而不是 FIT_NDF,但该错误也存在于博客文章中。)
      • 首先,R2 通常用作定性而非定量工具。对于许多应用,0.88 的 R2 实际上与 0.82 相似。但我很想了解更多关于这个 FIT_NDF + 2 逻辑的信息,因为它更准确。您还可以解释一下这种特殊适合与一般适合的术语吗?此外,为了清楚起见,这是拟合权的 R*2 值。因为这个 google 组 (groups.google.com/forum/?fromgroups=#!topic/…) 声称我们无法使用 gnuplot 计算 R*2。
      【解决方案3】:

      虽然没有直接解决此问题的方法,但有一种变通方法。我将使用 python/numpy 来说明它。首先,生成拟合并与python脚本连接的gnuplot脚本部分:

          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
      

      这会运行相关性.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)
      

      【讨论】:

        【解决方案4】:

        如果您正在寻找一种计算 correlation coefficient as defined on this page 的方法,那么使用 gnuplot 会很不走运,正如 Google Groups thread 中所述。

        还有很多其他计算相关系数的工具,例如numpy.

        【讨论】:

          猜你喜欢
          • 2015-09-05
          • 1970-01-01
          • 2018-06-15
          • 2019-01-16
          • 1970-01-01
          • 1970-01-01
          • 2020-01-10
          • 1970-01-01
          • 2013-09-29
          相关资源
          最近更新 更多