有没有办法在ImageJ中绘制线性回归?

时间:2016-04-29 20:52:50

标签: java plot linear-regression imagej

我有编码问题,我想绘制值(x和y)并计算线性回归并将其绘制在imageJ中。有人可以帮忙吗?

我试过这个

public class Plot implements PlugIn {
    public void run(String arg) {
        if (IJ.versionLessThan("1.27t"))
            return;

        float[] x = {0.375f, 0.75f, 1.5f, 2.25f, 3f,3.75f,4.5f,4.75f,5f};
        // x-coordinates
        float[] y = {123f,456f,5678f,4567f,4567f,5678f,2345f,4563f,2345f};
        // y-coordinates
        float[] e = {.8f,.6f,.5f,.4f,.3f,.5f,.6f,.7f,.8f};
        // error bars

        PlotWindow plot = new PlotWindow("Example Plot","x-axis","y-axis",x,y);
        plot.setLimits(0, 5.5, 0, 6000);
        plot.addErrorBars(e);

        // add a second curve
        float x2[] = {.4f,.5f,.6f,.7f,.8f};
        float y2[] = {4,3,3,4,5};

        int N=9;
        double sumx = 0.0, sumy = 0.0, sumx2 = 0.0;
        for (int i = 0; i < N; i++)
            sumx  += x[i];
        for (int i = 0; i < N; i++)
            sumx2 += x[i]*x[i];
        for (int i = 0; i < N; i++)
            sumy  += y[i];
        double xbar = sumx / N;
        double ybar = sumy / N;

        // second pass: compute summary statistics
        double xxbar = 0.0, yybar = 0.0, xybar = 0.0;
        for (int i = 0; i < N; i++) {
            xxbar += (x[i] - xbar) * (x[i] - xbar);
            yybar += (y[i] - ybar) * (y[i] - ybar);
            xybar += (x[i] - xbar) * (y[i] - ybar);
        }
        slope  = xybar / xxbar;
        intercept = ybar - slope * xbar;

        // more statistical analysis
        double rss = 0.0;      // residual sum of squares
        double ssr = 0.0;      // regression sum of squares
        for (int i = 0; i < N; i++) {
            double fit = slope*x[i] + intercept; //calculating fit
            rss += (fit - y[i]) * (fit - y[i]);
            ssr += (fit - ybar) * (fit - ybar); //calculating ssr
        }
    }
}

1 个答案:

答案 0 :(得分:0)

以下Groovy script(与Java非常相似,可以直接从ImageJ中的Script editor运行)说明了如何使用ij.gui.Plotij.measure.CurveFitter类用回归线生成一个图:

import ij.gui.Plot
import ij.measure.CurveFitter

x = [0.375d, 0.75d, 1.5d, 2.25d, 3d,3.75d,4.5d,4.75d,5d];
// x-coordinates
y = [123d,456d,5678d,4567d,4567d,5678d,2345d,4563d,2345d];
// y-coordinates

plot = new Plot("Example Plot","x-axis","y-axis");
plot.addPoints(x,y,Plot.LINE)
plot.setLimits(0, 5.5, 0, 6000);

cf = new CurveFitter((double[]) x, (double[]) y)
cf.doFit(CurveFitter.STRAIGHT_LINE)

yfit = []
for (cx in x) {
    yfit.add(cf.f(cx))
}

plot.addPoints(x, yfit, Plot.LINE)
plotwindow = plot.show()

一些建议:

  • 请勿拨打自己的班级Plot,因为您的代码读者可能会将其与ij.gui.Plot混淆。
  • 使用ij.gui.Plot代替ij.gui.PlotWindow;前者提供了更多功能。
  • 当有可用的工具时,不要进行手动回归。
  • 对于ImageJ and SciJava APIs特有的问题,最好的问题是ImageJ forum