Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Standardabweichung berechnen? (https://www.delphipraxis.net/167470-standardabweichung-berechnen.html)

mat72 31. Mär 2012 13:21

Delphi-Version: 5

Standardabweichung berechnen?
 
Hallo,
ich wollte die Standardabweichung von 8 eingegebenen Zahlen berechnen, aber irgendwie komme ich zu keinem brauchbaren Ergebnis.
Die Zahlen bekomme ich über ein Textfeld, welches ich in eine Zahl umwandel. Die Formel die ich für die Standardabweichung benutze ist
Delphi-Quellcode:
x:=sqrt((1/8)*(((x1-ave_x)*(x1-ave_x))+((x2-ave_x)*(x2-ave_x))+((x3-ave_x)*(x3-ave_x))+((x4-ave_x)*(x4-ave_x))+((x5-ave_x)*(x5-ave_x))+((x6-ave_x)*(x6-ave_x))+((x7-ave_x)*(x7-ave_x))+((x8-ave_x)*(x8-ave_x))))
ist die Formel richtig?
Wenn ich meine Berechnung mit Excel vergleiche, ist mein Wert immer größer.
Vielen Dank für eure Hilfe.
Gruß
Mat

guinnes 31. Mär 2012 14:58

AW: Standardabweichung berechnen?
 
Warum benutzt du nicht die fertige Function StdDev aus der Unit Math ?

mat72 31. Mär 2012 18:24

AW: Standardabweichung berechnen?
 
Wenn ich die Funktion StdDev verwende , bekomme ich die Meldung
[Fehler] globallevelingacc.pas(426): Inkompatible Typen: 'Array' und 'Extended'
Gibt es da eine Moeglichkeit, die Funktion zu nutzen, trotz Deklaration als Extended.

Peter1999 31. Mär 2012 18:36

AW: Standardabweichung berechnen?
 
Bei einem Freiwert (Mittelwert) steht da 1/(n-1) --> 1/7

DeddyH 31. Mär 2012 18:36

AW: Standardabweichung berechnen?
 
Das sind jetzt "viel zu viele" Infos, als dass wir damit etwas anfangen könnten :?.

mat72 31. Mär 2012 18:48

AW: Standardabweichung berechnen?
 
Hallo,
ich lese jede Zahl via Textfeld ein und wandele sie mit StrToFloat in eine Zahl um.
Im Anhang mein Programm.
Delphi-Quellcode:
unit globallevelingacc;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, jpeg, ExtCtrls, shellapi, math;

type
  TForm11 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    MainMenu1: TMainMenu;
    MainMenu2: TMenuItem;
    Help1: TMenuItem;
    Exit1: TMenuItem;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Label24: TLabel;
    Label25: TLabel;
    Label26: TLabel;
    Label27: TLabel;
    Label28: TLabel;
    Label29: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Button1: TButton;
    Label30: TLabel;
    Label31: TLabel;
    Label32: TLabel;
    Label33: TLabel;
    Button5: TButton;
    Label34: TLabel;
    procedure Exit1Click(Sender: TObject);
    procedure Help1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2Exit(Sender: TObject);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Edit3Exit(Sender: TObject);
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure Edit4Exit(Sender: TObject);
    procedure Edit4KeyPress(Sender: TObject; var Key: Char);
    procedure Edit5Exit(Sender: TObject);
    procedure Edit5KeyPress(Sender: TObject; var Key: Char);
    procedure Edit6Exit(Sender: TObject);
    procedure Edit6KeyPress(Sender: TObject; var Key: Char);
    procedure Edit7Exit(Sender: TObject);
    procedure Edit7KeyPress(Sender: TObject; var Key: Char);
    procedure Edit8Exit(Sender: TObject);
    procedure Edit8KeyPress(Sender: TObject; var Key: Char);
    procedure Edit9Exit(Sender: TObject);
    procedure Edit9KeyPress(Sender: TObject; var Key: Char);
    procedure Edit10Exit(Sender: TObject);
    procedure Edit10KeyPress(Sender: TObject; var Key: Char);
    procedure Edit11Exit(Sender: TObject);
    procedure Edit11KeyPress(Sender: TObject; var Key: Char);
    procedure Edit12Exit(Sender: TObject);
    procedure Edit12KeyPress(Sender: TObject; var Key: Char);
    procedure Edit13Exit(Sender: TObject);
    procedure Edit13KeyPress(Sender: TObject; var Key: Char);
    procedure Edit14Exit(Sender: TObject);
    procedure Edit14KeyPress(Sender: TObject; var Key: Char);
    procedure Edit15Exit(Sender: TObject);
    procedure Edit15KeyPress(Sender: TObject; var Key: Char);
    procedure Edit16Exit(Sender: TObject);
    procedure Edit16KeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form11: TForm11;
  x1,x2,x3,x4,x5,x6,x7,x8,y1,y2,y3,y4,y5,y6,y7,y8,ave_x,ave_y,x,y :extended;
implementation

{$R *.dfm}

procedure TForm11.Exit1Click(Sender: TObject);
begin
close();
end;

procedure TForm11.Help1Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', '.\help\GlobalLevelingAccuracy.html', nil, nil, SW_SHOW); //hier wird die Hilfe aufgerufen
end;



procedure TForm11.Button5Click(Sender: TObject);
begin
close();
end;

procedure TForm11.Edit1Exit(Sender: TObject);
begin
    try
       x1:=StrToFloat(Edit1.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit1.Clear;
          Edit1.SetFocus;
    end;
end;

procedure TForm11.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit2.SetFocus;
end;

procedure TForm11.Edit2Exit(Sender: TObject);
begin
    try
       y1:=StrToFloat(Edit2.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit2.Clear;
          Edit2.SetFocus;
    end;
end;

procedure TForm11.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit3.SetFocus;
end;

procedure TForm11.Edit3Exit(Sender: TObject);
begin
    try
       x2:=StrToFloat(Edit3.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit3.Clear;
          Edit3.SetFocus;
    end;
end;

procedure TForm11.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit4.SetFocus;
end;

procedure TForm11.Edit4Exit(Sender: TObject);
begin
    try
       y2:=StrToFloat(Edit4.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit4.Clear;
          Edit4.SetFocus;
    end;
end;

procedure TForm11.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit5.SetFocus;
end;

procedure TForm11.Edit5Exit(Sender: TObject);
begin
    try
       x3:=StrToFloat(Edit5.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit5.Clear;
          Edit5.SetFocus;
    end;
end;

procedure TForm11.Edit5KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit6.SetFocus;
end;

procedure TForm11.Edit6Exit(Sender: TObject);
begin
    try
       y3:=StrToFloat(Edit6.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit6.Clear;
          Edit6.SetFocus;
    end;
end;

procedure TForm11.Edit6KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit7.SetFocus;
end;

procedure TForm11.Edit7Exit(Sender: TObject);
begin
    try
       x4:=StrToFloat(Edit7.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit7.Clear;
          Edit7.SetFocus;
    end;
end;

procedure TForm11.Edit7KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit8.SetFocus;
end;

procedure TForm11.Edit8Exit(Sender: TObject);
begin
    try
       y4:=StrToFloat(Edit8.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit8.Clear;
          Edit8.SetFocus;
    end;
end;

procedure TForm11.Edit8KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit9.SetFocus;
end;

procedure TForm11.Edit9Exit(Sender: TObject);
begin
    try
       x5:=StrToFloat(Edit9.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit9.Clear;
          Edit9.SetFocus;
    end;
end;

procedure TForm11.Edit9KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit10.SetFocus;
end;

procedure TForm11.Edit10Exit(Sender: TObject);
begin
    try
       y5:=StrToFloat(Edit10.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit10.Clear;
          Edit10.SetFocus;
    end;
end;

procedure TForm11.Edit10KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit11.SetFocus;
end;

procedure TForm11.Edit11Exit(Sender: TObject);
begin
    try
       x6:=StrToFloat(Edit11.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit11.Clear;
          Edit11.SetFocus;
    end;
end;

procedure TForm11.Edit11KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit12.SetFocus;
end;

procedure TForm11.Edit12Exit(Sender: TObject);
begin
    try
       y6:=StrToFloat(Edit12.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit12.Clear;
          Edit12.SetFocus;
    end;
end;

procedure TForm11.Edit12KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit13.SetFocus;
end;

procedure TForm11.Edit13Exit(Sender: TObject);
begin
    try
       x7:=StrToFloat(Edit13.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit13.Clear;
          Edit13.SetFocus;
    end;
end;

procedure TForm11.Edit13KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit14.SetFocus;
end;

procedure TForm11.Edit14Exit(Sender: TObject);
begin
    try
       y7:=StrToFloat(Edit14.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit14.Clear;
          Edit14.SetFocus;
    end;
end;

procedure TForm11.Edit14KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit15.SetFocus;
end;

procedure TForm11.Edit15Exit(Sender: TObject);
begin
    try
       x8:=StrToFloat(Edit15.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit15.Clear;
          Edit15.SetFocus;
    end;
end;

procedure TForm11.Edit15KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit16.SetFocus;
end;

procedure TForm11.Edit16Exit(Sender: TObject);
begin
    try
       y8:=StrToFloat(Edit16.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit16.Clear;
          Edit16.SetFocus;
    end;
end;

procedure TForm11.Edit16KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit1.SetFocus;
end;

procedure TForm11.Button1Click(Sender: TObject);
begin
Label34.Caption := (' ');
//x:=stddev(x1,x2,x3,x4,x5,x6,x7,x8);
ave_x:=(x1+x2+x3+x4+x5+x6+x7+x8)/8;
ave_y:=(y1+y2+y3+y4+y5+y6+y7+y8)/8;
x:=3*(sqrt((1/8)*(((x1-ave_x)*(x1-ave_x))+((x2-ave_x)*(x2-ave_x))+((x3-ave_x)*(x3-ave_x))+((x4-ave_x)*(x4-ave_x))+((x5-ave_x)*(x5-ave_x))+((x6-ave_x)*(x6-ave_x))+((x7-ave_x)*(x7-ave_x))+((x8-ave_x)*(x8-ave_x)))));
y:=3*(sqrt((1/8)*(((y1-ave_y)*(y1-ave_y))+((y2-ave_y)*(y2-ave_y))+((y3-ave_y)*(y3-ave_y))+((y4-ave_y)*(y4-ave_y))+((y5-ave_y)*(y5-ave_y))+((y6-ave_y)*(y6-ave_y))+((y7-ave_y)*(y7-ave_y))+((y8-ave_y)*(y8-ave_y)))));
Label32.Caption := FloatToStrF(x, ffNumber, 8, 3);
Label33.Caption := FloatToStrF(y, ffNumber, 8, 3);
if (x>8) or (y>8) then
Label34.Caption := ('Out of Specification!')
end;

end.
Danke fuer eure Hilfe.
Gruss
Mat

DeddyH 31. Mär 2012 18:54

AW: Standardabweichung berechnen?
 
Zitat:

Delphi-Quellcode:
x:=stddev(x1,x2,x3,x4,x5,x6,x7,x8);

-->
Delphi-Quellcode:
x:=stddev([x1,x2,x3,x4,x5,x6,x7,x8]);
Das sind nur 2 Zeichen mehr ;)

silver-moon-2000 31. Mär 2012 18:54

AW: Standardabweichung berechnen?
 
Hi,

probier's mal so:
Delphi-Quellcode:
std_abw = StdDev([x1,x2,x3,x4,x5,x6,x7,x8])
Denn Delphi will ein Array als parameter und keine Liste von Extended bekommen.

In XE2 kann man auch ein "Array of Extenedd" übergeben (siehe hier), in früheren Versionen ging das noch nicht (siehe hier)

mat72 31. Mär 2012 18:56

AW: Standardabweichung berechnen?
 
Danke dir.
Jetzt verstehe ich auch die Fehlermeldung.
Problem geloest.

sx2008 31. Mär 2012 22:48

AW: Standardabweichung berechnen?
 
@mat72:
Sorry, aber ich muss es loswerden: dein Sourcecode ist ein Paradebeispiel wie man nicht programmieren sollte.
Dir fehlen offensichtlich die Grundlagen; das solltest ändern.
In fast jeder Programmiersprache gibt es Arrays und/oder Listen mit denen viele gleiche Dinge verwalten kann anstatt alle Variablen einzeln hinzuschreiben.
Deine Benutzeroberfläche ist auch eine kleine Katastrophe - für jede Zahl ein Edit und ein Label, wo soll das enden?
Nimm doch einfach ein TMemo und lass den Benutzer so viele Zahlen hineinschreiben oder kopieren wie er mag (eine Zahl pro Zeile).

BUG 1. Apr 2012 02:38

AW: Standardabweichung berechnen?
 
Mich würde trotzdem noch interessieren, was an der oben angegebenen Formel falsch ist.
Selbst wenn 1/7 der richtige Koeffizint wäre (siehe #4), würde der errechnete Wert nur noch größer werden.

Bummi 1. Apr 2012 07:19

AW: Standardabweichung berechnen?
 
ich war zu faul den ersten Post mit Fleisch zu versehen, ich meine 1/7 müsste passen
Delphi-Quellcode:
Function TestStdDev(a: Array of Double): Double;
var
  i: Integer;
  MW: Double;
begin
  MW := 0;
  Result := 0;
  for i := 0 to High(a) do MW := MW + a[i];
  MW := MW / ( High(a) + 1);
  for i := 0 to High(a) do Result := Result + Power(a[i] - MW, 2);
  Result := SQRT(Result / High(a));
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  SetLength(a, 10);
  for i := 0 to High(a) - 1 do
    a[i] := Random(100);
  Label1.Caption := FloatToStr(StdDev(a));
  Label2.Caption := FloatToStr(TestStdDev(a));
end;

ASM 1. Apr 2012 09:44

AW: Standardabweichung berechnen?
 
Zitat:

Zitat von BUG (Beitrag 1159623)
Mich würde trotzdem noch interessieren, was an der oben angegebenen Formel falsch ist.
Selbst wenn 1/7 der richtige Koeffizint wäre (siehe #4), würde der errechnete Wert nur noch größer werden.

Was soll denn diese äußerst merkwürdige Aussage ?

Wenn man eine statistische Auswertung erstellt, dann sollte man - auch bei bloßer Übernahme einer vorgefertigten Formel wie beispielsweise StdDev() bzw. MeanAndStdDev() aus der Unit Math - wenigstens verstehen, wie die Standardabweichung überhaupt zustande kommt, was sie beinhaltet: speziell hier eben ganz fundamental Stichwort Freiheitsgrad. Dieser aber wurde selbst nach dem entsprechenden Hinweis in #4 völlig ignoriert und wird in der grundlegenden Bedeutung offenbar gar nicht verstanden.

Berücksichtigt man korrekterweise den zutreffenden Freiheitsgrad in der in #6 verwendeten Formel, dann kommt mit deren Berechnung auch exakt der richtige Wert für die Standardabweichung heraus. Auch wenn diese selbstgebastelte Formel so etwas von unübersichtlich strukturiert ist...

BUG 1. Apr 2012 15:07

AW: Standardabweichung berechnen?
 
Zitat:

Zitat von ASM (Beitrag 1159633)
Was soll denn diese äußerst merkwürdige Aussage ?

  1. Ich sollte endlich mal eine Statistikvorlesung besuchen :pale:
  2. Der TE hat bemängelt, das die berechneten Werte zu groß sind. Egal was diese bedeuten, durch einen größeren Koeffizienten werden sie auf jeden Fall größer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz