So erstellen Sie einen Assistenten
Zusammenfassung
Ein Assistent ist eine grafische Benutzeroberfläche, die eine Reihe
von Dialogfeldern enthält, die den Anwender Schritt für Schritt durch
einen Prozess führen. Mit einem Assistenten werden komplexe Aufgaben einfacher
durchführbar. Origin enthält mehrere Klassen in Origin C, mit denen Anwender
einen Assistenten entwickeln können. Das Dialogfeld für jeden Schritt
in einem Assistenten kann mit Hilfe einer X-Funktion erstellt werden.
In diesem Beispiel kann der Assistent einen Test auf Normalverteilung
und einen t-Test bei einer Stichprobe für Daten in einer Spalte durchführen.
Das Ergebnis des Tests auf Normalverteilung kann in einem t-Test bei einer
Stichprobe geteilt werden.
Origin-Version mind. erforderlich: 8.1 SR0
Was Sie lernen werden
- Erstellen einer X-Funktion
- Teilen einer Variablen oder eines Datenbereichs in unterschiedlichen
Schritten
- Aufrufen einer X-Funktion in OriginC
- Erstellen eines Assistenten
Erstellen von vier X-Funktionen
- Wählen Sie Hilfsmittel: X-Funktionen erstellen oder drücken
Sie F10, um das Dialogfeld X-Funktionen erstellen zu öffnen.
- Fügen Sie die Variablen folgendermaßen ein und speichern Sie die
X-Funktion als "StatTest" im Anwenderdateiordner, Anwenderdateien\X-Functions\Statistics\Hypothesis
Testing.
- Klicken Sie auf die Schaltfläche Neuer X-Funktionen-Assistent.
Fügen Sie die Variablen folgendermaßen ein und speichern Sie die X-Funktion
als "StatTestWizGoal" im Anwenderdateiordner, Anwenderdateien\X-Functions\Statistics\Hypothesis
Testing.
- Klicken Sie auf die Schaltfläche Neuer X-Funktionen-Assistent.
Fügen Sie die Variablen folgendermaßen ein und speichern Sie die X-Funktion
als "NormalityTest" im Anwenderdateiordner, Anwenderdateien\X-Functions\Statistics\Hypothesis
Testing.
- Klicken Sie auf die Schaltfläche Neuer X-Funktionen-Assistent.
Fügen Sie die Variablen folgendermaßen ein und speichern Sie die X-Funktion
als "OnetTest" im Anwenderdateiordner, Anwenderdateien\X-Functions\Statistics\Hypothesis
Testing.
Beachten Sie, dass die X-Funktionen NormalityTest und OnetTest
die gleiche Variable "prob" besitzen, die eine geteilte Variable
darstellt und in der Quelldatei deklariert wird.
Aktualisieren der Eigenschaften der X-Funktion
in der Baumansicht
- Öffnen Sie die X-Funktion StatTest. Klicken Sie auf die
Schaltfläche Baumansicht , um die Baumansicht zu öffnen. Nehmen Sie in der Baumansicht
folgende Einstellungen vor.
- Klicken Sie auf die Schaltfläche OXF-Datei speichern, um
die X-Funktion zu speichern.
- Öffnen Sie die X-Funktion StatTestWizGoal, NormalityTest
und OnetTest jeweils im Dialogfeld X-Funktionen erstellen. Klicken
Sie auf die Schaltfläche Baumansicht , geben Sie "Select Wizard Goal",
"Normality Test" und "One-Sample t-test" im Bearbeitungsfeld
Beschreibung in der jeweiligen Baumansicht der X-Funktion ein.
Dies wird dann in den Dialogfeldern gezeigt.
Erstellen von Dateien für den Assistenten
- Klicken Sie auf die Schaltfläche Code Builder in der Symbolleiste
Standard. Klicken Sie im Code Builder auf die Schaltfläche Öffnen
. Wählen Sie im Dialogfeld Neue Datei die Option H File,
klicken Sie auf die Schaltfläche Durchsuchen und wählen Sie den
Anwenderdateiordner, Anwenderdateien\OriginC, als den Speicherort
der neuen Headerdatei. Geben Sie StatTestWiz im Bearbeitungsfeld Dateiname
ein. Klicken Sie auf OK , um das Dialogfeld zu schließen.
Fügen Sie das folgende Skript in die Datei StatTestWiz.h ein.
#ifndef __STAT_TEST_WIZ_H__
#define __STAT_TEST_WIZ_H__
#include <..\OriginLab\XFWiz.h>
#include <..\OriginLab\XFCore.h>
#include <..\OriginLab\XFWizard_utils.h>
class StatTestWizCore : public XFCore
{
public:
StatTestWizCore();
public:
void ChangeGoal(int nGoal);
DataRange GetRange();
int nStep;
protected:
};
int stat_test_run_wiz_nodlg(LPCSTR lpcszThemeName = NULL, const XFWizTheme *pXFWizTheme
= NULL, const XFWizInputOutputRange *pXFWizIO = NULL, DWORD dwOPUID = 0);
int stat_test_open_wiz_dlg(LPCSTR lpcszThemeName = NULL, const XFWizTheme *pXFWizTheme
= NULL, const XFWizInputOutputRange *pXFWizIO = NULL, DWORD dwOPUID = 0);
#endif //__STAT_TEST_WIZ_H__
Klicken Sie auf die Schaltfläche Speichern, um die Datei StatTestWiz.h
zu speichern.
- Wiederholen Sie die gleiche Operation, um eine neue C-Datei
zu erstellen, StatTestWiz.c.
Fügen Sie das folgende Skript in die Datei StatTestWiz.c ein.
///////////////////////////////////////////////////////////////////////////////////
#include <..\OriginLab\XFWizManager.h>
#include <..\OriginLab\WizOperation.h>
#include <..\OriginLab\XFWizNavigation.h>
#include <..\OriginLab\XFWizScript.h>
#include <..\OriginLab\XFWizDlg.h>
///////////////////////////////////////////////////////////////////////////////////
// Include your own header files here.
#include "StatTestWiz.h"
enum
{
GOAL_ALL = 0,
GOAL_SIMPLE,
};
//Names of three X-Functions
#define STR_STEP_GOAL "StatTestWizGoal"
#define STR_STEP_Normal "NormalityTest"
#define STR_STEP_TTest "OnetTest"
//Names of steps shown in the wizard.
#define STR_LABEL_STEP_GOAL "Goal"
#define STR_LABEL_STEP_Normal "Normality Test"
#define STR_LABEL_STEP_TTest "One-Sample t-test"
///////////////////////////////////////////////////////////////////////////////////
//Class StatTestWizTheme
class StatTestWizTheme : public XFWizTheme
{
public:
StatTestWizTheme();
};
//Name of the variable prob shared by X-Functions NormalityTest and OnetTest
#define STR_GETN_VAR_SHARED_NProb "prob"
StatTestWizTheme::StatTestWizTheme()
:XFWizTheme()
{
m_saSharedList.Add(STR_GETN_VAR_SHARED_NProb); //Add the shared variable
}
///////////////////////////////////////////////////////////////////////////////////
class StatTestWizInputOutputRange : public XFWizInputOutputRange
{
};
///////////////////////////////////////////////////////////////////////////////////
//Class StatTestWizManager
#define STR_CLASS_NAME_TEST "StatTestWiz"
#define TEST_VERSION_NUMBER 1.0
class StatTestWizManager : public XFWizManager
{
public:
StatTestWizManager(LPCSTR lpcszThemeName = NULL, const XFWizTheme *pXFWizTheme
= NULL, const XFWizInputOutputRange *pXFWizIO = NULL, DWORD dwUIDOp = 0);
protected:
virtual double GetVersion() { return TEST_VERSION_NUMBER; }
virtual XFCore* CreateXFCore() { return new StatTestWizCore; }
virtual XFWizTheme* CreateXFWizTheme() { return new StatTestWizTheme; }
virtual XFWizInputOutputRange* CreateXFWizInputOutputRange()
{ return new StatTestWizInputOutputRange; }
virtual string GetClassName() { return STR_CLASS_NAME_TEST; }
};
StatTestWizManager::StatTestWizManager(LPCSTR lpcszThemeName, const XFWizTheme
*pXFWizTheme, const XFWizInputOutputRange *pXFWizIO, DWORD dwUIDOp)
: XFWizManager(lpcszThemeName, pXFWizTheme, pXFWizIO, dwUIDOp)
{
StringArray saMapXFNames = {STR_STEP_GOAL, STR_STEP_Normal, STR_STEP_TTest};
StringArray saMapXFLabels = {STR_LABEL_STEP_GOAL, STR_LABEL_STEP_Normal,
STR_LABEL_STEP_TTest};
m_saMapXFNames = saMapXFNames;
m_saMapXFLabels = saMapXFLabels;
ASSERT( m_saMapXFNames.GetSize() == m_saMapXFLabels.GetSize() );
StringArray saMapXFNames = {STR_STEP_GOAL, STR_STEP_Normal, STR_STEP_TTest};
m_saDefaultXFNames = saDefaultXFNames;
m_strRunDlgName = _L("Stat Test");
}
///////////////////////////////////////////////////////////////////////////////////
//Class StatTestWizCore
StatTestWizCore::StatTestWizCore()
:XFCore()
{
StringArray vsXFsRecalculateShown = {STR_STEP_GOAL};
m_vsXFsRecalculateShown = vsXFsRecalculateShown;
nStep = GOAL_ALL;
}
//Select steps in the Goal Step
void StatTestWizCore::ChangeGoal(int nGoal)
{
XFWizNavigation *pXFWizNavg = (XFWizNavigation *)GetXFWizNavigation();
ASSERT(pXFWizNavg);
nStep = nGoal;
if ( pXFWizNavg )
{
StringArray saXFNames;
saXFNames.Add(STR_STEP_GOAL);
switch (nGoal)
{
case GOAL_ALL:
saXFNames.Add(STR_STEP_Normal);
saXFNames.Add(STR_STEP_TTest);
break;
case GOAL_SIMPLE:
saXFNames.Add(STR_STEP_TTest);
break;
}
pXFWizNavg->SetSteps(saXFNames);
}
}
//Get input DataRange in the Goal Step.
DataRange StatTestWizCore::GetRange()
{
XFWizNavigation *pXFWizNavg = (XFWizNavigation *)GetXFWizNavigation();
XFWizInputOutputRange* pIORange = pXFWizNavg->GetXFWizInputOutputRange();
DataRange drInput;
if(!pIORange)
{
error_report("Fail to get io ranges!");
return drInput;
}
Array<DataRange&> drs;
//Get input DataRange.
if(!pIORange->Get(&drs, STR_STEP_GOAL, true))
{
error_report("Fail to get range from WizCore!");
return drInput;
}
drInput = drs.GetAt(0);
return drInput;
}
///////////////////////////////////////////////////////////////////////////////////
int stat_test_run_wiz_nodlg(LPCSTR lpcszThemeName, const XFWizTheme *pXFWizTheme, const
XFWizInputOutputRange *pXFWizIO, DWORD dwOPUID)
{
TEMPLATE_run_wiz_nodlg(StatTestWizManager, lpcszThemeName, pXFWizTheme, pXFWizIO, dwOPUID)
}
int stat_test_open_wiz_dlg(LPCSTR lpcszThemeName, const XFWizTheme *pXFWizTheme, const
XFWizInputOutputRange *pXFWizIO, DWORD dwOPUID)
{
TEMPLATE_open_wiz_dlg(StatTestWizManager, lpcszThemeName, pXFWizTheme, pXFWizIO, dwOPUID)
}
int stat_test_run_wiz(UINT msg, const XFWizTheme *pXFWizTheme, const
XFWizInputOutputRange *pXFWizIO, DWORD dwOPUID, int nExeMode)
{
TEMPLATE_run_wiz(StatTestWizManager, msg, pXFWizTheme, pXFWizIO, dwOPUID, nExeMode)
}
Klicken Sie auf die Schaltfläche Speichern, um die Datei StatTestWiz.h
zu speichern.
Beachten Sie, das die X-Funktion StatTest vor der StatTestWiz.c
kompiliert werden sollte, damit sich die in StatTestWiz.c enthaltenen
Dateien im Arbeitsbereich befinden, bis die X-Funktion StatTest
kompiliert ist. StatTestWiz.h ist in der X-Funktion StatTest enthalten.
StatTestWiz.c wird automatisch kompiliert, wenn die X-Funktion StatTest
kompiliert wird.
Hinzufügen von Skript für X-Funktionen
Script für X-Funktion StatTest
Klicken Sie im Dialogfeld X-Funktionen erstellen auf die Schaltfläche
Öffnen und öffnen Sie die X-Function StatTest. Klicken Sie auf
X-Funktion in Code Builder bearbeiten und fügen Sie das folgende
Skript hinzu.
- Headerdateien einschließen
#include <..\OriginLab\XFWiz.h>
#include <..\OriginLab\WizOperation.h>
#include <..\OriginLab\XFCore.h>
#include <..\OriginLab\XFWizNavigation.h>
#include <..\OriginLab\XFWizManager.h>
#include <..\OriginLab\XFWizScript.h>
#include <..\OriginLab\XFWizDlg.h>
#include <..\OriginLab\XFWizard_utils.h>
#include <..\OriginLab\WksOperation.h>
#include <event_utils.h>
#include "StatTestWiz.h"
Fügen Sie den Funktionskörper hinzu, der den Dialogmodus festlegt.
if( script )
stat_test_run_wiz_nodlg(tn);
else
stat_test_open_wiz_dlg(tn);
- StatTest_before_execute()
Fügen Sie den Funktionskörper hinzu, mit dem bestimmt werden kann, ob
dieser Dialog vor dem Öffnen des Assistenten geöffnet werden soll.
nRet = XFEVT_PROCEED_NO_DLG;
Klicken Sie auf die Schaltfläche Kompilieren, um die Datei zu
kompilieren. Klicken Sie dann auf die Schaltfläche Zurück zum Dialog,
um zum Dialogfeld X-Funktionen erstellen zurückzukehren. Klicken
Sie im Dialog X-Funktionen erstellen auf die Schaltfläche OXF-Datei
speichern, um die X-Funktion zu speichern.
Skript für X-Funktion StatTestWizGoal
Öffnen Sie die X-Funktion StatTestWizGoal. Klicken Sie auf X-Funktion
in Code Builder bearbeiten und fügen Sie das folgende Skript hinzu.
- Headerdateien einschließen
#include "StatTestWiz.h"
- Hinzufügen der Statischen Funktion _check_input()
Diese Funktion wird verwendet, um zu prüfen, ob der Eingabedatenbereich
eine einzelne Spalte ist.
static bool _check_input(const TreeNode trGetN, string& strErr)
{
TreeNode trRange = trGetN.input;
DataRange drInput;
drInput.Create(trRange.strVal);
if( drInput.GetNumRanges() == 0 )
{
strErr = "Input can't be empty, and it should be a valid column.";
return false;
}
else
{
if( drInput.GetNumRanges() == 1)
{
Worksheet wksInput;
int nC1, nC2;
drInput.GetRange(wksInput, nC1, nC2);
if( nC1 == nC2 )
return true;
}
strErr = "Please select one column.";
return false;
}
}
Fügen Sie den Funktionskörper hinzu, der das Dialogfeld aktualisiert.
StatTestWizCore* pstatwc = (StatTestWizCore*)get_xf_core_handler(trGetN);
ASSERT(pstatwc);
//Update the Wizard page.
if ( 0 == lstrcmp(lpcszNodeName, "goal") )
pstatwc->ChangeGoal(trGetN.goal.nVal);
//Error message is shown at the bottom of the dialog,
//and OK button is disenabled for incorrect choice of DataRange.
bOKEnable = _check_input(trGetN, strErrMsg);
return false;
Klicken Sie auf die Schaltfläche Kompilieren, um die Datei zu
kompilieren. Klicken Sie dann auf die Schaltfläche Zurück zum NLSF,
um zum Dialogfeld X-Funktionen erstellen zurückzukehren, und klicken
Sie auf OXF-Datei speichern, um die X-Funktion zu speichern.
Skript für X-Funktion NormalityTest
Öffnen Sie die X-Funktion NormalityTest. Klicken Sie auf X-Funktion
in Code Builder bearbeiten und fügen Sie das folgende Skript hinzu.
- Headerdateien einschließen
#include "StatTestWiz.h"
#include <XFbase.h>
- Hinzufügen einer statischen Funktion _update_GUI()
Diese Funktion wird verwendet, um die Bearbeitungsfelder des Dialogfelds
für den Test auf Normalverteilung zu aktualisieren.
static void _update_GUI(TreeNode& trGetN)
{
vector vRes;
vRes = _norm_test(trGetN.nXFCorePointer.nVal, trGetN.type.nVal);
trGetN.stat.dVal = vRes[0];
trGetN.df.dVal = vRes[1];
trGetN.prob.dVal = vRes[2];
}
- Hinzufügen einer statischen Funktion _update_strErr()
Diese Funktion wird verwendet, um die unten im Dialogfeld gezeigte Zeichenkette
zu aktualisieren.
static void _update_strErr(const TreeNode tr, string& strErr)
{
if(tr.prob.dVal >= 0,05 && tr.prob.dVal <= 1)
strErr = "At the 0,05 level, the data was significantly drawn from a
normally distributed population.";
else if(tr.prob.dVal < 0,05 && tr.prob.dVal >= 0)
strErr = "At the 0,05 level, the data was not significantly drawn from a
normally distributed population.";
else
strErr = "There is not enough information to draw a conclusion.";
}
Beachten Sie, dass die Zeichenkette in zwei Zeilen geteilt ist, die
auf der Seite gezeigt werden. Im Skript sollte ein einzeiliger Befehl
enthalten sein.
- Hinzufügen einer statischen Funktion _norm_test()
Diese Funktion wird verwendet, um den Test auf Normalverteilung mit
Hilfe verwandter X-Funktionen durchzuführen.
static vector _norm_test(const int nXFCorePointer, const int nType)
{
StatTestWizCore* pstatwc = (StatTestWizCore*)get_xf_core_handler(nXFCorePointer);
ASSERT(pstatwc);
vector vRes(3);
vRes[2] = -1;
DataRange drInput;
drInput = pstatwc->GetRange[];
if( !drInput )
return vRes;
vector<string> vsXFName = {"swtest","kstest","lillietest"};
XFBase xfNorm(vsXFName[nType]);
if( !xfNorm.SetArg)"irng", drInput) )
{
error_report("Failed to set argument image type");
return vRes;
}
if( !xfNorm.SetArg("stat", vRes[0]) )
{
error_report("Failed to set argument image type");
return vRes;
}
if( !xfNorm.SetArg("df", vRes[1]) )
{
error_report("Failed to set argument image type");
return vRes;
}
if( !xfNorm.SetArg("prob", vRes[2]) )
{
error_report("Failed to set argument image type");
return vRes;
}
if( !xfNorm.Evaluate() )
{
error_report("Failed to evaluate the stats X-Function.");
return vRes;
}
return vRes;
}
Aktualisieren Sie den Funktionskörper, der das Ergebnis in ein Arbeitsblatt
exportiert, wenn auf die Schaltfläche Weiter geklickt wird.
DataRange drInput;
StatTestWizCore* pstatwc = (StatTestWizCore*)get_xf_core_handler(nXFCorePointer);
ASSERT(pstatwc);
drInput = pstatwc->GetRange[];
if( !drInput )
return;
string strBook, strSheet;
if(!drInput.GetBookSheet(strBook, strSheet))
{
error_report("Workbook and worksheet names can't be obtained.");
return;
}
WorksheetPage wpData(strBook);
int nLayer = wpData.AddLayer("Normality Test");
if(nLayer >= 0)
{
Worksheet wksRes = wpData.Layers(nLayer);
vector<string> vsTypeName = {"Shapiro-Wilk","Kolmogorov-Smirnov","Lilliefors"};
vector<string> vsNProb = {"Prob<W", "Prob>D", "Prob>D"};
vector<string> vsParaName = {"Statistic", "DF", ""};
vsParaName[2] = vsNProb[type];
vector vRes;
vRes = _norm_test[nXFCorePointer, type];
wksRes.Columns(1).SetLongName(vsTypeName[type]);
for(int ii=0; ii<3; ii++)
{
wksRes.SetCell(ii, 0, vsParaName[ii], false);
wksRes.SetCell(ii, 1, vRes[ii]);
}
}
else
{
error_report("New worksheet can't be created.");
}
Aktualisieren Sie den Funktionskörper, der die Ergebnisse im Dialogfeld
aktualisiert, sobald die Methode des Tests auf Normalverteilung gewechselt
wird. Zeichenketten unten im Dialogfeld werden ebenfalls aktualisiert.
_update_GUI(trGetN);
_update_strErr(trGetN, strErrMsg);
return true;
- NormalityTest_before_execute()
Aktualisiert den Funktionskörper, wodurch die Bearbeitungsfelder für
Ergebnisse ausgegraut werden, und zeigt das Ergebnis im Dialogfeld.
trGetN.stat.Enable = false;
trGetN.df.Enable = false;
trGetN.prob.Enable = false;
Klicken Sie auf die Schaltfläche Kompilieren, um die Datei zu
kompilieren. Klicken Sie dann auf die Schaltfläche Zurück zum NLSF,
um zum Dialogfeld X-Funktionen erstellen zurückzukehren, und klicken Sie
auf die Schaltfläche OXF-Datei speichern, um die X-Funktion zu
speichern.
Skript für X-Funktion OnetTest
Öffnen Sie die X-Funktion OnetTest. Klicken Sie auf X-Funktion
in Code Builder bearbeiten und fügen Sie das folgende Skript hinzu.
- Headerdateien einschließen
#include "StatTestWiz.h"
#include <XFbase.h>
const vector<string> vsNull = {"Mean = ","Mean <= ","Mean >= "};
const vector<string> vsAlter = {"Mean <> ","Mean > ","Mean < "};
const vector<string> vsAcceptNull = {"Not significantly different from","Not
significantly greater than","Not significantly less than"};
const vector<string> vsRejectNull = {"significantly different from","significantly
greater than","significantly less than"};
const vector<string> vsProb = {"Prob>|t|", "Prob>t", "Prob<t"};
- Hinzufügen der statischen Funktion _update_null()
Diese Funktion wird verwendet, um das Bearbeitungsfeld Null zu
aktualisieren.
static void _update_null(TreeNode& trGetN, bool bMean = false)
{
string strNull;
strNull = vsNull[trGetN.tail.nVal] + ftoa(trGetN.mean.dVal);
trGetN.null.strVal = strNull;
if(bMean)
{
string strAlter = vsAlter[0] + ftoa(trGetN.mean.dVal) + "|";
strAlter = strAlter + vsAlter[1] + ftoa(trGetN.mean.dVal) + "|";
strAlter = strAlter + vsAlter[1] + ftoa(trGetN.mean.dVal);
trGetN.tail.SetAttribute(STR_COMBO_ATTRIB, strAlter);
}
}
- Hinzufügen der statischen Funktion _check_sig_level()
Diese Funktion wird verwendet, um den Wert im Bearbeitungsfeld Signifikanzniveau
zu überprüfen.
static bool _check_sig_level(TreeNode& trGetN, string& strErr)
{
if( trGetN.siglevel.dVal > 0 && trGetN.siglevel.dVal < 1 )
{
return true;
}
else
{
strErr = "Significance Level should be between 0 and 1,";
return false;
}
}
- Hinzufügen einer statischen Funktion _update_strErr()
Diese Funktion wird verwendet, um die Zeichenkette für die Schlussfolgerung
des t-Tests unten zu definieren, basierend auf dem P-Wert.
static void _update_strErr(const TreeNode tr, string& strErr)
{
if(tr.tprob.dVal >= tr.siglevel.dVal && tr.tprob.dVal <= 1)
strErr.Format("Null Hypothesis is %s%s.\r\nAlternative Hypothesis is %s%s.
At the %s level, the population mean is %s the test mean(%s).",
vsNull[tr.tail.nVal], ftoa(tr.mean.dVal), vsAlter[tr.tail.nVal], ftoa(tr.mean.dVal),
ftoa(tr.siglevel.dVal), vsAcceptNull[tr.tail.nVal], ftoa(tr.mean.dVal) );
else if(tr.tprob.dVal < tr.siglevel.dVal && tr.tprob.dVal >= 0)
strErr.Format("Null Hypothesis is %s%s.\r\nAlternative Hypothesis is %s%s.
At the %s level, the population mean is %s the test mean(%s).",
vsNull[tr.tail.nVal], ftoa(tr.mean.dVal), vsAlter[tr.tail.nVal], ftoa(tr.mean.dVal),
ftoa(tr.siglevel.dVal), vsRejectNull[tr.tail.nVal], ftoa(;tr.mean.dVal); );
else
strErr = "There is not enough information to draw a conclusion.";
}
Beachten Sie, dass der Befehl in mehrere Zeilen geteilt ist, gezeigt
auf der Seite. Im Skript sollte ein einzeiliger Befehl enthalten sein.
- Hinzufügen einer statischen Funktion _update_GUI()
Diese Funktion wird verwendet, um die Bearbeitungsfelder für die Ergebnisse
im Dialogfeld zu aktualisieren.
static void _update_GUI(TreeNode& trGetN)
{
vector vRes;
vRes = _one_sample_t_test(trGetN.nXFCorePointer.nVal, trGetN.mean.dVal, trGetN.tail.dVal, trGetN.siglevel.dVal);
trGetN.stat.dVal = vRes[0];
trGetN.df.dVal = vRes[1];
trGetN.tprob.dVal = vRes[2];
trGetN.lcl.dVal = vRes[4];
trGetN.ucl.dVal = vRes[5];
}
- Hinzufügen einer statischen Funktion _one_sample_t_test()
Diese Funktion wird verwendet, um einen t-Test bei einer Stichprobe
mit Hilfe einer X-Funktion durchzuführen.
static vector _one_sample_t_test(const int nXFCorePointer, const double dMean, const int nTail, const double dSiglevel)
{
DataRange drInput;
StatTestWizCore* pstatwc = (StatTestWizCore*)get_xf_core_handler(nXFCorePointer);
ASSERT(pstatwc);
vector coeff(6);
vRes[2] = -1;
drInput = pstatwc->GetRange[];
if( !drInput )
return vRes;
vRes[3] = 100 - 100*dSiglevel;
XFBase xfTTest("ttest1");
if( !xfTTest.SetArg("irng", drInput) )
{
error_report("Failed to set argument irng");
return vRes;
}
if( !xfTTest.SetArg("mean", dMean) )
{
error_report("Failed to set argument mean");
return vRes;
}
if( !xfTTest.SetArg("tail", nTail) )
{
error_report("Failed to set argument tail");
return vRes;
}
if( !xfTTest.SetArg("alpha", dSiglevel) )
{
error_report("Failed to set argument alpha");
return vRes;
}
if( !xfTTest.SetArg("stat", vRes[0]) )
{
error_report("Failed to set argument stat");
return vRes;
}
if( !xfTTest.SetArg("df", vRes[1]) )
{
error_report("Failed to set argument df");
return vRes;
}
if( !xfTTest.SetArg("prob", vRes[2]) )
{
error_report("Failed to set argument prob");
return vRes;
}
if(; !xfTTest.SetArg("lcl", vRes[4]) )
{
error_report("Failed to set argument lcl");
return vRes;
}
if( !xfTTest.SetArg("ucl", vRes[5]) )
{
error_report("Failed to set argument ucI");
return vRes;
}
if( !xfTTest.Evaluate() )
{
error_report("Failed to evaluate the ttest1 X-Function.");
return vRes;
}
return vRes;
}
Aktualisieren Sie den Funktionskörper, der das Ergebnis in ein Arbeitsblatt
exportiert, wenn Sie auf die Schaltfläche Fertigstellen klicken.
DataRange drInput;
StatTestWizCore* pstatwc = (StatTestWizCore*)get_xf_core_handler(nXFCorePointer);
ASSERT(pstatwc);
drInput = pstatwc->GetRange[];
if( !drInput )
return;
string strBook, strSheet;
if(!drInput.GetBookSheet(strBook, strSheet))
{
error_report("Workbook and worksheet names can't be obtained.");
return;
}
WorksheetPage wpData(strBook);
int nLayer = wpData.AddLayer("One-Sample t-test");
if(nLayer >= 0)
{
Worksheet wksRes = wpData.Layers(nLayer);
vector<string> vsParaName = {"t Statistic", "DF","", "Conf. Levels in %", "Lower Limits", "Lower Limits"};
vsParaName[2] = vsProb]tail];
vector vRes;
vRes = _one_sample_t_test(nXFCorePointer, mean, tail, siglevel);
wksRes.SetSize(-1, 4);
wksRes.Columns(0).SetLongName("Test Statistics");
string strNull = "Null Hypothesis is " + vsNull[tail] + ftoa(mean);
wksRes.Columns(1).SetLongName(strNull);
wksRes.Columns(3).SetLongName("Confidence Intervals for Mean");
for(int ii=0; ii<3; ii++)
{
wksRes.SetCell(ii, 0, vsParaName[ii], false);
wksRes.SetCell(ii, 1, vRes[ii]);
wksRes.SetCell(ii, 2, vsParaName[ii + 3], false);
wksRes.SetCell(ii, 3, vRes[ii + 3]);
}
}
else
{
error_report("New worksheet can't be created.");
}
Aktualisieren Sie den Funktionskörper, wodurch die Ergebnisse aktualisiert
und eine Schlussfolgerung unten im Dialogfeld basierend auf dem Ergebnis
gezeigt wird. Das Bearbeitungsfeld Null wird aktualisiert, wenn
sich der Mittelwert und die Hypothese ändern und das Kontrollkästchen
Signifikanzniveau aktiviert ist.
if( 0 == lstrcmp(lpcszNodeName, "mean") )
_update_null(trGetN, true);
if( 0 == lstrcmp(lpcszNodeName, "tail") )
_update_null(trGetN);
if( 0 == lstrcmp(lpcszNodeName, "siglevel") )
bOKEnable = _check_sig_level(trGetN, strErrMsg);
_update_GUI(trGetN);
_update_strErr(trGetN, strErrMsg);
return false;
- OnetTest_before_execute()
Aktualisieren Sie den Funktionskörper, um die Bedienelemente in dem
Dialogfeld zu zeigen/verbergen oder zu deaktivieren.
StatTestWizCore* pstatwc = (StatTestWizCore*)get_xf_core_handler(trGetN.nXFCorePointer.nVal);
ASSERT(pstatwc);
trGetN.prob.Show = 1 - pstatwc->nStep;
trGetN.prob.Enable = false;
trGetN.null.Enable = false;
trGetN.stat.Enable = false;
trGetN.df.Enable = false;
trGetN.tprob.Enable = false;
trGetN.lcl.Enable = false;
trGetN.ucl.Enable = false;
Klicken Sie auf die Schaltfläche Kompilieren, um die Datei zu
kompilieren. Klicken Sie dann auf die Schaltfläche Zurück zum NSLF,
um zum Dialog X-Funktionen erstellen zurückzukehren. Klicken Sie auf die
Schaltfläche OXF-Datei speichern, um die X-Funktion zu speichern.
Schließen Sie Origin. Wenn Sie Origin dann starten, sehen Sie, dass
ein neues Element Stat Test zum Origin-Menü Statistik: Hypothesentest
hinzugefügt wurde.
Verwenden des Assistenten
Die folgenden Beispiele zeigen, wie der Assistent verwendet wird.
- Markieren Sie eine Spalte in dem Arbeitsblatt.
- Wählen Sie Statistik: Hypothesentest: Stat Test im Origin-Menü
oder geben Sie den Befehl "StatTest -d" im Befehlsfenster ein.
Das Dialogfeld Stat Test öffnet sich.
- Klicken Sie auf die Schaltfläche Weiter. Das Dialogfeld
Normality Test wird geöffnet. Das Ergebnis wird im Zweig Ausgabe
gezeigt. Unten im Dialogfeld wird eine Schlussfolgerung gezogen.
- Klicken Sie auf die Schaltfläche Weiter. Das Dialogfeld
One-Sample t-test wird geöffnet. Das Ergebnis wird im Zweig Ausgabe
gezeigt. Unten im Dialogfeld wird eine Schlussfolgerung gezogen. Das Ergebnis
des Test auf Normalverteilung aus dem vorhergehenden Schritt wird oben
gezeigt. Sie können auch die Einstellung im Dialogfeld ändern und die
Änderung des Ergebnisses sehen.
- Klicken Sie auf die Schaltfläche Fertigstellen, um den Assistenten
zu beenden. Zwei Arbeitsblätter für die Ergebnisse werden erstellt.
|