cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Try the Materials Informatics Toolkit, which is designed to easily handle SMILES data. This and other helpful add-ins are available in the JMP® Marketplace
Choose Language Hide Translation Bar
ond_stats
Level II

Name Unresolved: Column name will not resolved when I specify it as a value in a list

I am trying to calculate the AUC for each column in a data table. I am collecting all of the column names into a list "colNamesList", and retrieving each column name in Fit Model inside a For loop by incrementing the list subscript. However, the call to the array is not resolving inside the Fit Model call.  If I include show(colNamesList[i]) on a separate line, it resolves fine, just not inside the Fit Model call. I am using a script from a prior post in this forum, and I suspect that my older version of JMP (version 9.0.0) just needs slightly different syntax. Any ideas would be appreciated.

 

Names Default To Here( 1 );

// Open and example data table
dt = Open( "sample.jmp" );

// Get the columns to be analyzed
colNamesList = dt << get column names( string );

// Create a data table to save the results to
dtOutput = New Table( "Results", New Column( "var_name", character ), New Column( "AUC", character ) );

// Loop across all of the columns to be analyzed and retrieve the AUC
For( i = 1, i <= N Items( colNamesList ), i++,
	// Add a new row to the output data table
	dtOutput << Add Rows( 1 );
	// Add the active variable name to the current row in the data table
	dtOutput:var_name[i] = colNamesList[i];
	// Run the Logistic Regression
	theLog = dt << Fit Model(invisible, Y( :case ),Effects( column (colNameList[i]) ),Personality( Nominal Logistic ),Run(Positive Level( "1" ),Likelihood Ratio Tests( 1 ),ROC Curve( 1 ),));
	// Add the AUC to the data table by grabbing it from the display report output
	dtOutput:AUC = (Report( theLog )["Receiver Operating Characteristic"][numberbox(1)] << get text);
	// Close the report window
	Report( theLog ) << close window;
);

The error in the log is as follows:

Name Unresolved: colNameList{1}

 in access or evaluation of 'colNameList' , colNameList

Exception in platform launch{1}

 in access or evaluation of 'Fit Model' , Fit Model(
	invisible,
	Y( :case ),
	Effects( Column( colNameList[i] ) ),
	Personality( Nominal Logistic ),
	Run( Positive Level( "1" ), Likelihood Ratio Tests( 1 ), ROC Curve( 1 ) )
)

In the following script, error marked by /*###*/
Fit Model(
	invisible,
	Y( :case ),
	Effects( Column( colNameList/*###*/[i] ) ),
	Personality( Nominal Logistic ),
	Run( Positive Level( "1" ), Likelihood Ratio Tests( 1 ), ROC Curve( 1 ) )
)
Cannot subscript Display Box{1}

 in access or evaluation of 'Subscript' , Report( theLog )["Receiver Operating Characteristic"]

In the following script, error marked by /*###*/
Names Default To Here( 1 );
dt = Open( "sample.jmp" );
colNamesList = dt << get column names( string );
dtOutput = New Table( "Results",
	New Column( "var_name", character ),
	New Column( "AUC", character )
);
For( i = 1, i <= N Items( colNamesList ), i++,
	dtOutput << Add Rows( 1 );
	dtOutput:var_name[i] = colNamesList[i];
	theLog = dt << Fit Model(/*###*/invisible,
		Y( :case ),
		Effects( Column( colNameList[i] ) ),
		Personality( Nominal Logistic ),
		Run( Positive Level( "1" ), Likelihood Ratio Tests( 1 ), ROC Curve( 1 ) )
	);
	dtOutput:AUC = Report( theLog )[/*###*/"Receiver Operating Characteristic"][
	numberbox( 1 )] << get text;
	Report( theLog ) << close window;
);
1 ACCEPTED SOLUTION

Accepted Solutions
ond_stats
Level II

Re: Name Unresolved: Column name will not resolved when I specify it as a value in a list

Yes, that was a typo and fixing it was part of the solution, so thanks for seeing that. I was still getting a "could not find column{1}" error, and that resolved by referencing the data table when specifying the column: Column(dt, colNamesList[i]) instead of Column(colNamesList[i]). Then I got the error "Response should also not be a factor, ^1case", so I added an IF statement to ignore the response column. This ran whether I added the subscript to AUC. 

 

So here is my first jsl script. Quite a learning experience. Thanks to txnelson for you help!

 

Names Default To Here( 1 );

// Open and example data table
dt = Open( "sample.jmp" );

// Get the columns to be analyzed
colNamesList = dt << get column names( string );

// Create a data table to save the results to
dtOutput = New Table( "Results", New Column( "var_name", character ), New Column( "AUC", character ) );

// Loop across all of the columns to be analyzed and retrieve the AUC
For( i = 1, i <= N Items( colNamesList ), i++,
	// Add a new row to the output data table
	dtOutput << Add Rows( 1 );
	// Add the active variable name to the current row in the data table
	dtOutput:var_name[i] = colNamesList[i];
	//Get the next column name
	colName = colNamesList[i];
	// If the column is "case", leave AUC blank, otherwise run the Logistic Regression
	if(colName=="case", AUC=.,
		theLog = dt << Fit Model(
			invisible,
			Y(:case),
			Effects(column(dt,colName)),
			Personality( Nominal Logistic ),
			Run(
				Positive Level( "1" ),
				Likelihood Ratio Tests( 1 ),
				ROC Curve( 1 ),
				)
			);
		// Add the AUC to the data table by grabbing it from the display report output
		dtOutput:AUC[i] = (Report( theLog )["Receiver Operating Characteristic"][numberbox(1)] << get text);
	);
	// Close the report window
	Report( theLog ) << close window;
);

View solution in original post

3 REPLIES 3
txnelson
Super User

Re: Name Unresolved: Column name will not resolved when I specify it as a value in a list

  1. The reason the Name was Unresolved is because you called the list, colNamesList, and you referenced it as colNameLise.
  2. The AUC value needs to be placed at a defined row, therefore you need to add the suscript to dtOutput:AUC
Names Default To Here( 1 );

// Open and example data table
dt = Open( "sample.jmp" );

// Get the columns to be analyzed
colNamesList = dt << get column names( string );

// Create a data table to save the results to
dtOutput = New Table( "Results", New Column( "var_name", character ), New Column( "AUC", character ) );

// Loop across all of the columns to be analyzed and retrieve the AUC
For( i = 1, i <= N Items( colNamesList ), i++, 
	// Add a new row to the output data table
	dtOutput << Add Rows( 1 );
	// Add the active variable name to the current row in the data table
	dtOutput:var_name[i] = colNamesList[i];
	// Run the Logistic Regression
	theLog = dt << Fit Model(
		invisible,
		Y( :case ),
		Effects( Column( colNamesList[i] ) ),
		Personality( Nominal Logistic ),
		Run( Positive Level( "1" ), Likelihood Ratio Tests( 1 ), ROC Curve( 1 ) )
	);
	
	// Add the AUC to the data table by grabbing it from the display report output
	dtOutput:AUC[i] = (Report( theLog )["Receiver Operating Characteristic"][numberbox( 1 )] << get text);
	// Close the report window
	Report( theLog ) << close window;
);
Jim
ond_stats
Level II

Re: Name Unresolved: Column name will not resolved when I specify it as a value in a list

Yes, that was a typo and fixing it was part of the solution, so thanks for seeing that. I was still getting a "could not find column{1}" error, and that resolved by referencing the data table when specifying the column: Column(dt, colNamesList[i]) instead of Column(colNamesList[i]). Then I got the error "Response should also not be a factor, ^1case", so I added an IF statement to ignore the response column. This ran whether I added the subscript to AUC. 

 

So here is my first jsl script. Quite a learning experience. Thanks to txnelson for you help!

 

Names Default To Here( 1 );

// Open and example data table
dt = Open( "sample.jmp" );

// Get the columns to be analyzed
colNamesList = dt << get column names( string );

// Create a data table to save the results to
dtOutput = New Table( "Results", New Column( "var_name", character ), New Column( "AUC", character ) );

// Loop across all of the columns to be analyzed and retrieve the AUC
For( i = 1, i <= N Items( colNamesList ), i++,
	// Add a new row to the output data table
	dtOutput << Add Rows( 1 );
	// Add the active variable name to the current row in the data table
	dtOutput:var_name[i] = colNamesList[i];
	//Get the next column name
	colName = colNamesList[i];
	// If the column is "case", leave AUC blank, otherwise run the Logistic Regression
	if(colName=="case", AUC=.,
		theLog = dt << Fit Model(
			invisible,
			Y(:case),
			Effects(column(dt,colName)),
			Personality( Nominal Logistic ),
			Run(
				Positive Level( "1" ),
				Likelihood Ratio Tests( 1 ),
				ROC Curve( 1 ),
				)
			);
		// Add the AUC to the data table by grabbing it from the display report output
		dtOutput:AUC[i] = (Report( theLog )["Receiver Operating Characteristic"][numberbox(1)] << get text);
	);
	// Close the report window
	Report( theLog ) << close window;
);
txnelson
Super User

Re: Name Unresolved: Column name will not resolved when I specify it as a value in a list

Great job!

 

You can avoid the error response by changing the line to

try(Report( theLog ) << close window);

You can also shorten and make the JSL run more efficiently by removing the duplicate assignments to a single statement

colName = dtOutput:var_name[i] = colNamesList[i];
Jim