Combination of two algorithms
viralvector
I try to compare several groups to a common control. I have been trying to add a customized algorithm mean squared error (see the image ) into Dunnett Test function but failed.
Can you give me an idea about combining these two algorithm togather?
Here is the mean squared error code:
Function WSFI(ctrlwave, treatwave, xl, xr)
wave ctrlwave, treatwave //control waves
variable xl, xr // (left and right bracket)
duplicate/R=(xl, xr)/FREE bw, bdw
duplicate/R=(xl, xr)/FREE tw, tdw
MatrixOP/FREE MSE=Sum(magsqr(bdw - tdw))/numPoints(tdw)
return MSE[0]
End
wave ctrlwave, treatwave //control waves
variable xl, xr // (left and right bracket)
duplicate/R=(xl, xr)/FREE bw, bdw
duplicate/R=(xl, xr)/FREE tw, tdw
MatrixOP/FREE MSE=Sum(magsqr(bdw - tdw))/numPoints(tdw)
return MSE[0]
End
Here is the DunnettTest function which was written by my boss
Function pksDunnettFn(ctrlWave)
String ctrlWave
WAVE M_DunnettTestResults
WAVE /T T_DunnettDescriptors
//Prompt ctrlWave,"Select control wave:",popup,WaveList("*",";","")+";_none_"
String wName, wList, waveLabel, nStars
Variable j, resultNrows, pValue, qValue, nWaves, totalSamples
// print ctrlWave
// compile wave name list from top table: ctrl wave first element
wList = ctrlWave + ";"
j = 0
totalSamples = numpnts($ctrlWave) // cumulate total # of samples
do
wName = WaveName("", j, 1)
wName = ReplaceString(".d", wName, "") // strip '.d' from wave names sometimes
if ( (cmpstr(wName ,"") != 0) && (cmpstr(wName ,ctrlWave) != 0) ) // append wave name if not null or ctrlWave name
wList = wList + wName + ";"
totalSamples += numpnts($wName) // cumulate total # of samples
endif
j += 1
while (cmpstr(wName ,"") != 0 )
nWaves = j-1
//print nWaves
print wList
// do the Dunnett's
// StatsDunnettTest /ALPH=0.05 /T=1 /WSTR=wList /TAIL=4 /SWN
StatsDunnettTest /ALPH=0.05 /WSTR=wList /TAIL=4 /SWN
resultNrows = DimSize(M_DunnettTestResults, 0 ) // # rows in result
Make /T /O /N=(resultNrows+1, 5) pksDunnettResultTable
pksDunnettResultTable[0][0] = "CONTROL"
pksDunnettResultTable[0][1] = "TEST GRP"
pksDunnettResultTable[0][3] = "CONTROL MEAN"
pksDunnettResultTable[0][4] = "TEST GRP MEAN"
pksDunnettResultTable[0][2] = "P VALUE *0.05 **0.01"
for (j=0; j<resultNrows; j+=1)
// waveLabel = GetDimLabel(M_DunnettTestResults, 0, j )
// next test wave
// wName = StringFromList(j+1, wList)
waveLabel = T_DunnettDescriptors[j]
wName = StringFromList(1, ReplaceString(" vs ", waveLabel,";"))
pValue = M_DunnettTestResults[j][5]
if (pValue >= 0.05)
nStars = ""
elseif (pValue >= 0.01)
nStars = "*"
else
nStars = "**"
endif
if ( M_DunnettTestResults[j][4] == 0)
// print ctrlWave + " vs " + wName + ": mean " + ctrlWave + " (control) = " + num2str(mean($ctrlWave)) + ", mean " + wName + " = " + num2str(mean($wName)) + ". Means ARE different (P = " + num2str(pValue) + ")" + nStars
else
// print ctrlWave + " vs " + wName + ": mean " + ctrlWave + " (control) = " + num2str(mean($ctrlWave)) + ", mean " + wName + " = " + num2str(mean($wName)) + ". Means are NOT different (P = " + num2str(pValue) + ")"
endif
pksDunnettResultTable[j+1][0] = ctrlWave
pksDunnettResultTable[j+1][3] = num2str(mean($ctrlWave))
pksDunnettResultTable[j+1][1] = wName
pksDunnettResultTable[j+1][4] = num2str(mean($wName))
pksDunnettResultTable[j+1][2] = num2str(pValue) + " " + nStars
endfor
print "* = significant at 5% level; ** = significant at 1% level"
Edit /K=1 /W=(400, 70, 400+600, 300)pksDunnettResultTable as "Dunnett Result Table"
ModifyTable /Z width[1]=140, width[2]=140, width[3]=140, showParts=16+32+64
end function
String ctrlWave
WAVE M_DunnettTestResults
WAVE /T T_DunnettDescriptors
//Prompt ctrlWave,"Select control wave:",popup,WaveList("*",";","")+";_none_"
String wName, wList, waveLabel, nStars
Variable j, resultNrows, pValue, qValue, nWaves, totalSamples
// print ctrlWave
// compile wave name list from top table: ctrl wave first element
wList = ctrlWave + ";"
j = 0
totalSamples = numpnts($ctrlWave) // cumulate total # of samples
do
wName = WaveName("", j, 1)
wName = ReplaceString(".d", wName, "") // strip '.d' from wave names sometimes
if ( (cmpstr(wName ,"") != 0) && (cmpstr(wName ,ctrlWave) != 0) ) // append wave name if not null or ctrlWave name
wList = wList + wName + ";"
totalSamples += numpnts($wName) // cumulate total # of samples
endif
j += 1
while (cmpstr(wName ,"") != 0 )
nWaves = j-1
//print nWaves
print wList
// do the Dunnett's
// StatsDunnettTest /ALPH=0.05 /T=1 /WSTR=wList /TAIL=4 /SWN
StatsDunnettTest /ALPH=0.05 /WSTR=wList /TAIL=4 /SWN
resultNrows = DimSize(M_DunnettTestResults, 0 ) // # rows in result
Make /T /O /N=(resultNrows+1, 5) pksDunnettResultTable
pksDunnettResultTable[0][0] = "CONTROL"
pksDunnettResultTable[0][1] = "TEST GRP"
pksDunnettResultTable[0][3] = "CONTROL MEAN"
pksDunnettResultTable[0][4] = "TEST GRP MEAN"
pksDunnettResultTable[0][2] = "P VALUE *0.05 **0.01"
for (j=0; j<resultNrows; j+=1)
// waveLabel = GetDimLabel(M_DunnettTestResults, 0, j )
// next test wave
// wName = StringFromList(j+1, wList)
waveLabel = T_DunnettDescriptors[j]
wName = StringFromList(1, ReplaceString(" vs ", waveLabel,";"))
pValue = M_DunnettTestResults[j][5]
if (pValue >= 0.05)
nStars = ""
elseif (pValue >= 0.01)
nStars = "*"
else
nStars = "**"
endif
if ( M_DunnettTestResults[j][4] == 0)
// print ctrlWave + " vs " + wName + ": mean " + ctrlWave + " (control) = " + num2str(mean($ctrlWave)) + ", mean " + wName + " = " + num2str(mean($wName)) + ". Means ARE different (P = " + num2str(pValue) + ")" + nStars
else
// print ctrlWave + " vs " + wName + ": mean " + ctrlWave + " (control) = " + num2str(mean($ctrlWave)) + ", mean " + wName + " = " + num2str(mean($wName)) + ". Means are NOT different (P = " + num2str(pValue) + ")"
endif
pksDunnettResultTable[j+1][0] = ctrlWave
pksDunnettResultTable[j+1][3] = num2str(mean($ctrlWave))
pksDunnettResultTable[j+1][1] = wName
pksDunnettResultTable[j+1][4] = num2str(mean($wName))
pksDunnettResultTable[j+1][2] = num2str(pValue) + " " + nStars
endfor
print "* = significant at 5% level; ** = significant at 1% level"
Edit /K=1 /W=(400, 70, 400+600, 300)pksDunnettResultTable as "Dunnett Result Table"
ModifyTable /Z width[1]=140, width[2]=140, width[3]=140, showParts=16+32+64
end function
String ctrlWave
WAVE M_DunnettTestResults
WAVE /T T_DunnettDescriptors
//Prompt ctrlWave,"Select control wave:",popup,WaveList("*",";","")+";_none_"
String wName, wList, waveLabel, nStars
Variable j, resultNrows, pValue, qValue, nWaves, totalSamples
// print ctrlWave
// compile wave name list from top table: ctrl wave first element
wList = ctrlWave + ";"
j = 0
totalSamples = numpnts($ctrlWave) // cumulate total # of samples
do
wName = WaveName("", j, 1)
wName = ReplaceString(".d", wName, "") // strip '.d' from wave names sometimes
if ( (cmpstr(wName ,"") != 0) && (cmpstr(wName ,ctrlWave) != 0) ) // append wave name if not null or ctrlWave name
wList = wList + wName + ";"
totalSamples += numpnts($wName) // cumulate total # of samples
endif
j += 1
while (cmpstr(wName ,"") != 0 )
nWaves = j-1
//print nWaves
print wList
// do the Dunnett's
// StatsDunnettTest /ALPH=0.05 /T=1 /WSTR=wList /TAIL=4 /SWN
StatsDunnettTest /ALPH=0.05 /WSTR=wList /TAIL=4 /SWN
resultNrows = DimSize(M_DunnettTestResults, 0 ) // # rows in result
Variable xl=0,xr=1 // @@change 0 Replace 0 and 1!!!
Make /T /O /N=(resultNrows+1, 6) pksDunnettResultTable // @@change 1
pksDunnettResultTable[0][0] = "CONTROL"
pksDunnettResultTable[0][1] = "TEST GRP"
pksDunnettResultTable[0][3] = "CONTROL MEAN"
pksDunnettResultTable[0][4] = "TEST GRP MEAN"
pksDunnettResultTable[0][2] = "P VALUE *0.05 **0.01"
pksDunnettResultTable[0][5] = "MSE" // @@change 2
Wave cw=$ctrlWave // @@change 3
for (j=0; j<resultNrows; j+=1)
// waveLabel = GetDimLabel(M_DunnettTestResults, 0, j )
// next test wave
// wName = StringFromList(j+1, wList)
waveLabel = T_DunnettDescriptors[j]
wName = StringFromList(1, ReplaceString(" vs ", waveLabel,";"))
Wave ww=$wName // @@change 4
pValue = M_DunnettTestResults[j][5]
if (pValue >= 0.05)
nStars = ""
elseif (pValue >= 0.01)
nStars = "*"
else
nStars = "**"
endif
if ( M_DunnettTestResults[j][4] == 0)
// print ctrlWave + " vs " + wName + ": mean " + ctrlWave + " (control) = " + num2str(mean($ctrlWave)) + ", mean " + wName + " = " + num2str(mean($wName)) + ". Means ARE different (P = " + num2str(pValue) + ")" + nStars
else
// print ctrlWave + " vs " + wName + ": mean " + ctrlWave + " (control) = " + num2str(mean($ctrlWave)) + ", mean " + wName + " = " + num2str(mean($wName)) + ". Means are NOT different (P = " + num2str(pValue) + ")"
endif
pksDunnettResultTable[j+1][0] = ctrlWave
pksDunnettResultTable[j+1][3] = num2str(mean($ctrlWave))
pksDunnettResultTable[j+1][1] = wName
pksDunnettResultTable[j+1][4] = num2str(mean($wName))
pksDunnettResultTable[j+1][2] = num2str(pValue) + " " + nStars
pksDunnettResultTable[j+1][5] = WSFI(cw, ww, xl, xr) // @@change 5
endfor
print "* = significant at 5% level; ** = significant at 1% level"
Edit /K=1 /W=(400, 70, 400+600, 300)pksDunnettResultTable as "Dunnett Result Table"
ModifyTable /Z width[1]=140, width[2]=140, width[3]=140, showParts=16+32+64
end
May 6, 2014 at 02:51 pm - Permalink
I am sorry that I did not clarify the goal. Yet you generously gave the best guesses for the goal.
I tried to calculate the mean square error within a range of waves used for Dunnett's test.
I have two groups for Dunnett's test
group 1- control
group 2- different treatments. eg. 5 different waves from 5 different treatments. group2a-2e
I can easily perform Dunnett's test, but I want to add mean square error into it.
At the end, I will have such data of comparison:
group1- group2a = Dunnett's score + mean square error
group1- group2b =Dunnett's score + mean square error
group1- group2c =Dunnett's score + mean square error
group1- group2d =Dunnett's score + mean square error
group1- group2e =Dunnett's score + mean square error
The mean square error which was written here ( the help from IGOR team previously)
wave ctrlwave, treatwave //control waves
variable xl, xr // (left and right bracket)
duplicate/R=(xl, xr)/FREE ctrlwave, bdw
duplicate/R=(xl, xr)/FREE treatwave, tdw
MatrixOP/FREE MSE=Sum(magsqr(bdw - tdw))/numPoints(tdw)
return MSE[0]
End
xl and xr are the bracket to set the range of wave.
supposedly, ctrlwave is the ctrlwave shares with Dunnett's test; treatwave is the group of 2a-2e.
I tried your suggestion, but failed to compile it with the message saying:
Got "WSFI" instead of string variable or string function name.
Error in Stats:pksDunnettFn
pksDunnettResultTable[j+1][5] = WSFI (cw,ww,xl,xr)
Any clues?
Thank you very much!!
May 9, 2014 at 10:31 am - Permalink
change
pksDunnettResultTable[j+1][5] = WSFI(cw, ww, xl, xr)
to
pksDunnettResultTable[j+1][5] = num2str( WSFI(cw, ww, xl, xr) )
The former line attempts to assign a numeric value to a text wave. The latter converts the numeric value to a string before doing the assignment.
May 9, 2014 at 12:32 pm - Permalink
Thank you for the input. The error is gone.
I have received another error after running the function.
I got :
Function Execution Error
While executing Make, the following error occurred:
The number of points in wave must be between 0 and 2147 million.
and the table show up with empty value.
....Sot sure where to solve it.
Thank you in advance.
May 9, 2014 at 04:00 pm - Permalink
Read about the debugger:
DisplayHelpTopic "The Debugger"
John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
May 9, 2014 at 04:19 pm - Permalink
The only statement that I can see involving the Make operation is this one
Make /T /O /N=(resultNrows+1, 6) pksDunnettResultTable // @@change 1
Either use the debugger as John suggests or a print statement to see what value resultNrows is taking on.
The debugger is a very useful tool to have. You should follow John's advice.
May 9, 2014 at 07:36 pm - Permalink