Averaging Histogram
bech
Note that the standard deviation calculated should be used with caution. In reporting the standard error of the mean, the function implicitly assumes that the variation of the data across the bin is small compared to the statistical errors in the data. In the example code below the function, this condition is not met, and the error is really a combination of a deterministic spread and statistical error.
Note that the function requires v6.1 only because it uses the new /FREE flag. If you use an earlier version, just omit the flag. You may then want to add a KillWaves statement to delete those temporary waves.
Function HistAvgSd(datawave,timewave,dt,tmin) // average all points in interval dt; computes sd, too
Wave datawave,timewave // datawave = data taken at unevenly spaced times
Variable dt,tmin // dt = bin size, tmin = start time of binned data
Variable n = numpnts(datawave) // number of points in datawave
Variable tmax = timewave[numpnts(timewave)-1], k=ceil((tmax-tmin)/dt) // number of bins
String wd_string = NameOfWave(datawave)+ "_avg", ws_string = NameOfWave(datawave) + "_sd"
Make /o/n=(k) $wd_string=NaN,$ws_string=NaN // avg & sd waves
Make /o/n=(k+1) /FREE indexwave // left-bin positions (temp wave)
Wave wd = $wd_string, ws = $ws_string
SetScale/P x tmin+dt/2,dt,"", wd, ws // x-scaling for average, sd waves
SetScale/P x tmin,dt,"", indexwave // x-scaling for index wave
Duplicate /o /FREE datawave datawave1 // sorted waves (temporary)
Duplicate /o /FREE timewave timewave1
Sort timewave1 timewave1,datawave1 // sort according to times
indexwave = BinarySearch(timewave1,x)+1 // index vals for left edges of bins
indexwave[k] = n // to get all the points in last bin
wd = mean(datawave1,indexwave[p],indexwave[p+1]-1)
wd = (indexwave[p+1]== indexwave[p]) ? NaN : wd // if no data in bin set to NaN
ws = sqrt(Variance(datawave1,indexwave[p],indexwave[p+1]-1)/(indexwave[p+1]-indexwave[p]))
End
Wave datawave,timewave // datawave = data taken at unevenly spaced times
Variable dt,tmin // dt = bin size, tmin = start time of binned data
Variable n = numpnts(datawave) // number of points in datawave
Variable tmax = timewave[numpnts(timewave)-1], k=ceil((tmax-tmin)/dt) // number of bins
String wd_string = NameOfWave(datawave)+ "_avg", ws_string = NameOfWave(datawave) + "_sd"
Make /o/n=(k) $wd_string=NaN,$ws_string=NaN // avg & sd waves
Make /o/n=(k+1) /FREE indexwave // left-bin positions (temp wave)
Wave wd = $wd_string, ws = $ws_string
SetScale/P x tmin+dt/2,dt,"", wd, ws // x-scaling for average, sd waves
SetScale/P x tmin,dt,"", indexwave // x-scaling for index wave
Duplicate /o /FREE datawave datawave1 // sorted waves (temporary)
Duplicate /o /FREE timewave timewave1
Sort timewave1 timewave1,datawave1 // sort according to times
indexwave = BinarySearch(timewave1,x)+1 // index vals for left edges of bins
indexwave[k] = n // to get all the points in last bin
wd = mean(datawave1,indexwave[p],indexwave[p+1]-1)
wd = (indexwave[p+1]== indexwave[p]) ? NaN : wd // if no data in bin set to NaN
ws = sqrt(Variance(datawave1,indexwave[p],indexwave[p+1]-1)/(indexwave[p+1]-indexwave[p]))
End
Here is some code to test the function:
•make /o/n=20 dtwave,datwave
•dtwave = enoise(1)+1
•Integrate dtwave/D=twave // irregularly spaced time points
•datwave = p + gnoise(1)
•display datwave vs twave
•HistAvgSd(datwave,twave,5,0)
•append datwave_avg
•ModifyGraph mode=3,marker(datwave)=8,marker(datwave_avg)=19;DelayUpdate
•ModifyGraph rgb(datwave_avg)=(1,4,52428);DelayUpdate
•ErrorBars datwave_avg Y,wave=(datwave_sd,datwave_sd)
•ModifyGraph grid(bottom)=2
•dtwave = enoise(1)+1
•Integrate dtwave/D=twave // irregularly spaced time points
•datwave = p + gnoise(1)
•display datwave vs twave
•HistAvgSd(datwave,twave,5,0)
•append datwave_avg
•ModifyGraph mode=3,marker(datwave)=8,marker(datwave_avg)=19;DelayUpdate
•ModifyGraph rgb(datwave_avg)=(1,4,52428);DelayUpdate
•ErrorBars datwave_avg Y,wave=(datwave_sd,datwave_sd)
•ModifyGraph grid(bottom)=2
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More