2016-04-29 6 views
-1

Ich habe ein Codierungsproblem, wo ich Werte (x und y) plotten und die lineare Regression berechnen und in imageJ plotten möchte. Kann jemand helfen?Gibt es eine Möglichkeit, lineare Regression in ImageJ grafisch darzustellen?

Ich habe versucht, diese

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 
     } 
    } 
} 
+0

Was funktioniert nicht? Wie geht es diesem Code nicht, was Sie erwarten? – jessehouwing

Antwort

0

Die folgende Groovy script (die Java sehr ähnlich ist, und kann direkt aus dem Script editor in ImageJ ausgeführt werden) zeigt, wie die ij.gui.Plot und ij.measure.CurveFitter Klassen verwenden, um ein Grundstück mit erzeugen eine Regressionslinie:

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() 

einige Empfehlungen:

  • Nennen Sie nicht Ihre eigene Klasse Plot, da ein Leser Ihres Codes es mit ij.gui.Plot verwechseln könnte.
  • Verwendung ij.gui.Plot anstelle von ij.gui.PlotWindow; Ersteres bietet mehr Funktionalität.
  • Führen Sie keine manuelle Regression durch, wenn hierfür Werkzeuge verfügbar sind.
  • Für Fragen speziell auf die ImageJ and SciJava APIs, ist der beste Platz zu fragen, die ImageJ forum.
Verwandte Themen