2016-04-29 2 views
-1

У меня проблема с кодированием, где я хочу отображать значения (x и y) и вычислять линейную регрессию и строить ее в imageJ. Может ли кто-нибудь помочь?Есть ли способ построить линейную регрессию в 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 
     } 
    } 
} 
+0

Что не работает? Как этот код не выполняет то, что вы ожидаете от него? – jessehouwing

ответ

0

Следующая Groovy script (который очень похож на Java, и может работать прямо из Script editor в ImageJ) показано, как использовать ij.gui.Plot и ij.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.
Смежные вопросы