A simple panel for statistical comparison of two 1D waves
wwzhang2
#include <WaveSelectorWidget>
Function Make2WaveSelectorPanel()
String panelName = "WaveSelectorExample"
// figure out what to show in the Wave Selector, and make an appropriate name for the panel
panelName+="Waves"
if (WinType(panelName) == 7)
// if the panel already exists, show it
DoWindow/F $panelName
else
// doesn't exist, make it
NewPanel/N=$panelName/W=(181,179,471,510) as "Wave Selector Example"
// list box control doesn't have any attributes set on it
ListBox ExampleWaveSelectorList,pos={9,13},size={273,241}
// This function does all the work of making the listbox control into a
// Wave Selector widget. Note the optional parameter that says what type of objects to
// display in the list.
MakeListIntoWaveSelector(panelName, "ExampleWaveSelectorList", content = WMWS_Waves)
PopupMenu sortKind, pos={9,270},title="Sort Waves By"
MakePopupIntoWaveSelectorSort(panelName, "ExampleWaveSelectorList", "sortKind")
// This is an extra bonus- you can create your own function to be notified of certain events,
// such as a change in the selection in the list.
WS_SetNotificationProc(panelName, "ExampleWaveSelectorList", "ExtExampleNotification", isExtendedProc=1)
// To support this demo, provide a button that displays this code
Button Gr2Comp,pos={9,300},size={110,20},proc=gr2stat_0,title="2 Group"
Button GrPairComp,pos={130,300},size={110,20},proc=gr2stat_1,title="Pair"
endif
End
Function gr2stat_0(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
comp2(1)// click code here
break
case -1: // control being killed
break
endswitch
return 0
End
Function gr2stat_1(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
comp2(3)// click code here
break
case -1: // control being killed
break
endswitch
return 0
End
Function comp2(p2)
variable p2
string w_sed = WS_SelectedObjectsList("Waveselectorexamplewaves","ExampleWaveSelectorList")
string x1_n = StringFromList(0, w_sed)
string x2_n = StringFromlist(1, w_sed)
wave x1 = $x1_n
wave x2 = $x2_n
sn_nb();Append2SN_TS()
Append2SN("*" + x1_n + ":\r mean = " + num2str(mean(x1)) + " sem = " + num2str(sqrt(variance(x1)/numpnts(x1))) + " n = " + num2str(numpnts(x1)))
Append2SN("*" + x2_n + ":\r mean = " + num2str(mean(x2)) + " sem = " + num2str(sqrt(variance(x2)/numpnts(x2))) + " n = " + num2str(numpnts(x2)))
if (p2 == 1)
Append2SN("*** Compare 2 waves ***")
cmp2(1, x1, x2)
elseif (p2 == 3)
Append2SN("*** Compare paired waves ***")
cmp2(3, x1, x2)
ENDIF
END
Function Append2SN_TS() //Time Stamp
Variable stampDateTime = 1 // nonzero if we want to include stamp
Variable tnow
String stamp
Notebook StatNote selection={endOfFile, endOfFile}
tnow = datetime
stamp = Secs2Date(tnow,0) + ", " + Secs2Time(tnow,0)
Notebook StatNote text="\r" + "****" + stamp + "****\r"
End
Function Append2SN(str) //Add Log
String str
Notebook StatNote selection={endOfFile, endOfFile}
Notebook StatNote text= str+"\r"
End
Function sn_nb()
if (WinType("StatNote") == 5)
// if StatNote already exists, show it
DoWindow/F StatNote
else
newnotebook /n=StatNote /F=1 as "Stat Results Note"
ENDIF
END
Function effect_size(x1, x2)
wave x1, x2
variable cohen_s_d = abs(mean(x1) - mean (x2))/sqrt((variance(x1) + variance(x2))/2)
Append2SN("*Effect Size:\r Cohen's d = " + num2str(cohen_s_d) + " (d = 0.2, small; 0.5, medium; 0.8, large)")
END
Function cmp2(p2, x1, x2)
variable p2
wave x1, x2
statsjbtest/Q x1
wave W_JBResults
variable nd_x1
if (W_JBResults[3] < W_JBResults[5])
Append2SN("x1 is Normal distribution")
nd_x1 = 1
else
Append2SN("x1 is not normal")
nd_x1 = 0
ENDIF
statsjbtest/Q x2
wave W_JBResults
variable nd_x2
if (W_JBResults[3] < W_JBResults[5])
Append2SN("x1 is Normal distribution")
nd_x2 = 1
else
Append2SN("x1 is not normal")
nd_x1 = 0
ENDIF
statsvariancestest/Q x1, x2
wave W_statsVariancesTest
variable nd_xs
if (W_statsVariancesTest[2] < W_statsVariancesTest[3])
Append2SN("x1, x2 variance same")
nd_xs = 1
else
Append2SN("x1, x2 variance NOT same")
nd_xs = 0
ENDIF
variable p2w_con = (nd_x1==1 && nd_x2==1 && nd_xs==1)
variable p2_final = p2 + p2w_con
variable hs_rn = (CaptureHistoryStart())
switch(p2_final)
case 2:
Append2SN("USE T-TEST\r" + capturehistory(hs_rn, 0) )
statsttest x1, x2
break
case 1:
Append2SN("USE K-S TEST\r" + capturehistory(hs_rn, 0))
statskstest x1, x2
break
case 4:
Append2SN("USE paired T-TEST\r" + capturehistory(hs_rn, 0))
statsttest /PAIR x1, x2
break
case 3:
Append2SN("USE Wilcoxon Signed Rank Test\r" +capturehistory(hs_rn, 0))
StatsWilcoxonRankTest /WSRT x1, x2
break
endswitch
Append2SN(CaptureHistory(hs_rn, 1))
effect_size(x1, x2)
END
Menu "Macros"
"2 waves analysis", Make2WaveSelectorPanel()
END
Function Make2WaveSelectorPanel()
String panelName = "WaveSelectorExample"
// figure out what to show in the Wave Selector, and make an appropriate name for the panel
panelName+="Waves"
if (WinType(panelName) == 7)
// if the panel already exists, show it
DoWindow/F $panelName
else
// doesn't exist, make it
NewPanel/N=$panelName/W=(181,179,471,510) as "Wave Selector Example"
// list box control doesn't have any attributes set on it
ListBox ExampleWaveSelectorList,pos={9,13},size={273,241}
// This function does all the work of making the listbox control into a
// Wave Selector widget. Note the optional parameter that says what type of objects to
// display in the list.
MakeListIntoWaveSelector(panelName, "ExampleWaveSelectorList", content = WMWS_Waves)
PopupMenu sortKind, pos={9,270},title="Sort Waves By"
MakePopupIntoWaveSelectorSort(panelName, "ExampleWaveSelectorList", "sortKind")
// This is an extra bonus- you can create your own function to be notified of certain events,
// such as a change in the selection in the list.
WS_SetNotificationProc(panelName, "ExampleWaveSelectorList", "ExtExampleNotification", isExtendedProc=1)
// To support this demo, provide a button that displays this code
Button Gr2Comp,pos={9,300},size={110,20},proc=gr2stat_0,title="2 Group"
Button GrPairComp,pos={130,300},size={110,20},proc=gr2stat_1,title="Pair"
endif
End
Function gr2stat_0(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
comp2(1)// click code here
break
case -1: // control being killed
break
endswitch
return 0
End
Function gr2stat_1(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
comp2(3)// click code here
break
case -1: // control being killed
break
endswitch
return 0
End
Function comp2(p2)
variable p2
string w_sed = WS_SelectedObjectsList("Waveselectorexamplewaves","ExampleWaveSelectorList")
string x1_n = StringFromList(0, w_sed)
string x2_n = StringFromlist(1, w_sed)
wave x1 = $x1_n
wave x2 = $x2_n
sn_nb();Append2SN_TS()
Append2SN("*" + x1_n + ":\r mean = " + num2str(mean(x1)) + " sem = " + num2str(sqrt(variance(x1)/numpnts(x1))) + " n = " + num2str(numpnts(x1)))
Append2SN("*" + x2_n + ":\r mean = " + num2str(mean(x2)) + " sem = " + num2str(sqrt(variance(x2)/numpnts(x2))) + " n = " + num2str(numpnts(x2)))
if (p2 == 1)
Append2SN("*** Compare 2 waves ***")
cmp2(1, x1, x2)
elseif (p2 == 3)
Append2SN("*** Compare paired waves ***")
cmp2(3, x1, x2)
ENDIF
END
Function Append2SN_TS() //Time Stamp
Variable stampDateTime = 1 // nonzero if we want to include stamp
Variable tnow
String stamp
Notebook StatNote selection={endOfFile, endOfFile}
tnow = datetime
stamp = Secs2Date(tnow,0) + ", " + Secs2Time(tnow,0)
Notebook StatNote text="\r" + "****" + stamp + "****\r"
End
Function Append2SN(str) //Add Log
String str
Notebook StatNote selection={endOfFile, endOfFile}
Notebook StatNote text= str+"\r"
End
Function sn_nb()
if (WinType("StatNote") == 5)
// if StatNote already exists, show it
DoWindow/F StatNote
else
newnotebook /n=StatNote /F=1 as "Stat Results Note"
ENDIF
END
Function effect_size(x1, x2)
wave x1, x2
variable cohen_s_d = abs(mean(x1) - mean (x2))/sqrt((variance(x1) + variance(x2))/2)
Append2SN("*Effect Size:\r Cohen's d = " + num2str(cohen_s_d) + " (d = 0.2, small; 0.5, medium; 0.8, large)")
END
Function cmp2(p2, x1, x2)
variable p2
wave x1, x2
statsjbtest/Q x1
wave W_JBResults
variable nd_x1
if (W_JBResults[3] < W_JBResults[5])
Append2SN("x1 is Normal distribution")
nd_x1 = 1
else
Append2SN("x1 is not normal")
nd_x1 = 0
ENDIF
statsjbtest/Q x2
wave W_JBResults
variable nd_x2
if (W_JBResults[3] < W_JBResults[5])
Append2SN("x1 is Normal distribution")
nd_x2 = 1
else
Append2SN("x1 is not normal")
nd_x1 = 0
ENDIF
statsvariancestest/Q x1, x2
wave W_statsVariancesTest
variable nd_xs
if (W_statsVariancesTest[2] < W_statsVariancesTest[3])
Append2SN("x1, x2 variance same")
nd_xs = 1
else
Append2SN("x1, x2 variance NOT same")
nd_xs = 0
ENDIF
variable p2w_con = (nd_x1==1 && nd_x2==1 && nd_xs==1)
variable p2_final = p2 + p2w_con
variable hs_rn = (CaptureHistoryStart())
switch(p2_final)
case 2:
Append2SN("USE T-TEST\r" + capturehistory(hs_rn, 0) )
statsttest x1, x2
break
case 1:
Append2SN("USE K-S TEST\r" + capturehistory(hs_rn, 0))
statskstest x1, x2
break
case 4:
Append2SN("USE paired T-TEST\r" + capturehistory(hs_rn, 0))
statsttest /PAIR x1, x2
break
case 3:
Append2SN("USE Wilcoxon Signed Rank Test\r" +capturehistory(hs_rn, 0))
StatsWilcoxonRankTest /WSRT x1, x2
break
endswitch
Append2SN(CaptureHistory(hs_rn, 1))
effect_size(x1, x2)
END
Menu "Macros"
"2 waves analysis", Make2WaveSelectorPanel()
END
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More
nice contribution! very useful when exploring data.
Thanks
April 18, 2018 at 10:28 am - Permalink