Combination of two algorithms

Hi

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


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
I am not sure that I understand your goal here but here is the first cut. Look for comments that mark the 6 changes I propose and make sure to fill the xl and xr values.

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
 	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
Hi IGOR,

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)

Function WSFI(ctrlwave, treatwave, xl, xr)
	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!!

viralvector wrote:
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?


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.
Hi Jtigor,

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.



Use the Igor debugger. In any Procedure window, right-click and select Enable Debugger. Then right-click again and select Debug on Error. I would also right-click again and select NVAR, SVAR, Wave Checking, but you don't need that to solve the immediate problem.

Read about the debugger:

DisplayHelpTopic "The Debugger"

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
viralvector wrote: Hi Jtigor,

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.


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.