ftp.nice.ch/peanuts/GeneralData/Documents/user-groups/SNUG/1992.01.tar.gz#/1992.01/snug.mbox/Re__Linear_least_squ__1.attach/linreg.c

This is linreg.c in view mode; [Download] [Up]

/* Name   : LINREG.C
  Version: 1992-04-07,16:44 mhi

   Zweck:
  Soll von einem ASCII-File Daten einlesen, die einfache
  LINeare REGression berechnen (der Fehler der Werte
  wird hierbei nicht beachtet) und die Koeffizienten
  auf einen ASCII-Ausgabefile schreiben.

   Kommandostruktur:
  linreg x y < inputfilename > outputfilename
  
  wobei x und y die Spaltennummern der Variablen sind (y = a1*x + b1).
  Die Ausgabe erfolgt in einer Zeile: r a1 b1 a2 b2 mx sx my sy.
  Dabei ist r der Korrelations-Koeffizient und es gilt  x = a2*y + b2.
  sx, sy, mx, my sind die Standardabweichungen und Mittelwerte
  fuer x und y.
*/
#import "stdio.h"
#import "string.h"

#include <math.h>

#define MAXSPALTEN 16

void main(argc, argv)
int   argc;
char *argv[];
{
  double a1;                     /* Steigung der Geraden y = a1*x + b1 */
  double a2;                     /* Steigung der Geraden x = a2*y + b2 */
  double b1;                     /* Y-Abschnitt der Geraden y = a1*x + b1 */
  double b2;                     /* Y-Abschnitt der Geraden x = a2*y + b2 */
  double hm,hn,hp;               /* Hilfsgroessen */
  int k = 1;                     /* Index */
  double mx,my;    /* Mittelwerte */
  int n = 0;       /* Anzahl Messwerte */
  double r;    /* Korrelationskoeffizient */
  double sx = -1.0;              /* Standardabweichung in x */
  double sy = -1.0;              /* Standardabweichung in x */
  double sumx = 0.0;             /* Summe der x-Werte */
  double sumxy = 0.0;            /* Summe der Produkte x*y */
  double sumx2 = 0.0;            /* Summe der Quadrate der x-Werte */
  double sumy = 0.0;             /* Summe der y-Werte */
  double sumy2 = 0.0;            /* Summe der Quadrate der y-Werte */
  double wert[MAXSPALTEN+1];     /* eingelesene Zahlenwerte */
  int xspalte;      /* Zeilennummer der Abszisse */
  int yspalte;     /* Zeilennummer der Ordinate */
  char   zeile[256];             /* einzulesende Zeile */

/* --- gibt es Argumente? */
  if (argc > 2)
  {
    sscanf(argv[1],"%d",&xspalte);
    sscanf(argv[2],"%d",&yspalte);
  }
  else
  {
    printf("Benutzerhinweis zur Kommando-Struktur von LINREG: \n");
    printf("linreg xspalte yspalte < inputfilename > outputfilename");
  }
/* --- Einlesen und Summieren der Werte: */
  while (gets(zeile) != NULL)
  {
    k = sscanf(zeile,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
    &wert[1],&wert[2],&wert[3],&wert[4],
    &wert[5],&wert[6],&wert[7],&wert[8],
    &wert[9],&wert[10],&wert[11],&wert[12],
    &wert[13],&wert[14],&wert[15],&wert[16]);
    if (xspalte > k)
    {
      printf("LINREG: keine Spalte %d im input file\n",xspalte);
      return;
    }
    if (yspalte > k)
    {
      printf("LINREG: keine Spalte %d im input file\n",yspalte);
      return;
    }
    if ((xspalte > MAXSPALTEN) || (yspalte > MAXSPALTEN))
    {
      printf("LINREG: Maximum von %d Spalten ueberschritten \n",MAXSPALTEN);
      return;
    }
    n++;
    /* printf("Spalte = %d  ",spalte); */
    /* printf("%d   %lf   %lf\n",n,wert[1],wert[2]); */
    sumx  += wert[xspalte];
    sumx2 += wert[xspalte] * wert[xspalte];
    sumxy += wert[xspalte] * wert[yspalte];
    sumy  += wert[yspalte];
    sumy2 += wert[yspalte] * wert[yspalte];
  }

/* --- Berechnen der linearen Regression: */
  hm = (n * sumx2) - (sumx * sumx);
  hn = (n * sumy2) - (sumy * sumy);
  hp = (n * sumxy) - (sumx * sumy);
  r = hp /sqrt(hm * hn);
  a1 = hp / hm;
  b1 = ((hm * sumy) - (hp * sumx)) / (n * hm);
  a2 = hp / hn;
  b2 = ((hn * sumx) - (hp * sumy)) / (n * hn);
  mx = sumx / n;
  sx = sqrt( hm / (n*(n-1)) );
  my = sumy / n;
  sy = sqrt( hn / (n*(n-1)) );

/* --- Ausgabe der linearen Regression: */
  printf("%lf  ",r);
  printf("%lf  ",a1);
  printf("%lf  ",b1);
  printf("%lf  ",a2);
  printf("%lf  ",b2);
  printf("%lf  ",mx);
  printf("%lf  ",sx);
  printf("%lf  ",my);
  printf("%lf\n",sy);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.