The Origin Forum
File Exchange
Try Origin for Free
The Origin Forum
Home | Profile | Register | Active Topics | Members | Search | FAQ | Send File to Tech support
 All Forums
 Origin Forum for Programming
 Forum for Origin C
 sequential linear fit of all rows in the column

Note: You must be registered in order to post a reply.
To register, click here. Registration is FREE!

Screensize:
UserName:
Password:
Anti-Spam Code:
Format Mode:
Format: BoldItalicizedUnderlineStrikethrough Align LeftCenteredAlign Right Horizontal Rule Insert HyperlinkUpload FileInsert Image Insert CodeInsert QuoteInsert List
   
Message:

* HTML is OFF
* Forum Code is ON
Smilies
Smile [:)] Big Smile [:D] Cool [8D] Blush [:I]
Tongue [:P] Evil [):] Wink [;)] Clown [:o)]
Black Eye [B)] Eight Ball [8] Frown [:(] Shy [8)]
Shocked [:0] Angry [:(!] Dead [xx(] Sleepy [|)]
Kisses [:X] Approve [^] Disapprove [V] Question [?]

 
Check here to subscribe to this topic.
   

T O P I C    R E V I E W
michaeli98 Posted - 07/19/2012 : 4:51:10 PM
Origin Ver. and Service Release (Select Help-->About Origin): OriginPro 8.6.0 SR3 b99
Operating System: XP SP3

Hi,

I am trying to sequentially fit two columns to a straight line (first 5 rows, 6, 7, 8, 9, and so on until the end of the column). I am trying to use a for-loop to do this, but seems like the index does not change. any suggestions are greatly appreciated. Here is the code that I have so far.

void linearfit()
{

// Get XY data from worksheet window
Worksheet wks = Project.ActiveLayer();
if(!wks)
return; // need to activate a worksheet with data
WorksheetPage wp = wks.GetPage();

DataRange dr;

int nRows = wks.GetNumRows();

printf("Number of rows is %d\n", nRows);

for(int ii=5; ii<nRows; ii++)
{
dr.Add("X", wks, 1, 0, ii, 0); // x column
dr.Add("Y", wks, 1, 1, ii, 1); // y column

vector vX;
dr.GetData(&vX, 0); // get data of x column to vector

vector vY;
dr.GetData(&vY, 1); // get data of y column to vector

// Do linear fit with the above input dataset and fit option settings
int nSize = vX.GetSize(); // data size
printf("Data size is %d\n", nSize);

FitParameter psFitParameter[2]; // two parameters
RegStats stRegStats; // regression statistics
RegANOVA stRegANOVA; // anova statistics

int nRet = ocmath_linear_fit(vX, vY, nSize, psFitParameter, NULL,
0, NULL, &stRegStats, &stRegANOVA);
if(nRet != STATS_NO_ERROR)
{
out_str("Error");
return;
}
// Output analysis result to Script window, Result Log and Worksheet
// print the values of fitting parameters to the Script Window
vector<string> vsParams = {"Intercept", "Slope"};
for(int iPara = 0; iPara < vsParams.GetSize(); iPara++)
{
printf("%s = %g\n", vsParams[iPara], psFitParameter[iPara].Value);
}
}
}

Thanks,
Michael
5   L A T E S T    R E P L I E S    (Newest First)
Penn Posted - 04/05/2013 : 4:25:52 PM
Hi Michael,

The link I provided includes the codes on how to get and set values to worksheet. Also, you can refer to this page on how to put the result to worksheet with normal column view or tree format view. To make it simple, the SetCell method can be your option.

Penn
michaeli98 Posted - 04/03/2013 : 7:45:13 PM
Hi All,

I am back onto this project. I have the script that sequentially fits the data in the active worksheet to a straight line (5 data points, 6 data points, etc.) and reports the slope, intercept, and rmse for each fit into the script window.
Is there an easy way to report the results into a separate worksheet?

Here is a script that I have so far.
void linearfit()
{

// Get XY data from worksheet window
Worksheet wks = Project.ActiveLayer();
if(!wks)
return; // need to activate a worksheet with data
WorksheetPage wp = wks.GetPage();

Please point me in the right direction.
int nRows = wks.GetNumRows();

printf("Number of rows is %d\n", nRows);

{
for(int ii=4; ii<nRows; ii++) // ii start from 4 for the first 5 rows
{
DataRange dr; // declare inside the loop as local variable
dr.Add("X", wks, 0, 0, ii, 0); // x column, from first row to (ii+1)th row
dr.Add("Y", wks, 0, 1, ii, 1); // y column

vector vX;
dr.GetData(&vX, 0); // get data of x column to vector

vector vY;
dr.GetData(&vY, 1); // get data of y column to vector

// Do linear fit with the above input dataset and fit option settings
int nSize = vX.GetSize(); // data size
printf("Data size is %d\n", nSize);

FitParameter psFitParameter[2]; // two parameters
RegStats stRegStats; // regression statistics
RegANOVA stRegANOVA; // anova statistics

int nRet = ocmath_linear_fit(vX, vY, nSize, psFitParameter, NULL, 0, NULL, &stRegStats, &stRegANOVA);
if(nRet != STATS_NO_ERROR)
{
out_str("Error");
return;
}
// Output analysis result to Script window, Result Log and Worksheet
// print the values of fitting parameters to the Script Window
vector<string> vsParams = {"Intercept", "Slope"};
for(int iPara = 0; iPara < vsParams.GetSize(); iPara++)
{
printf("%s = %g\n", vsParams[iPara], psFitParameter[iPara].Value);
}
printf("RMSE : %lf\n", stRegStats.RMSESD);

}
}
}
Penn Posted - 07/23/2012 : 04:51:31 AM
Hi Michael,

Maybe you can refer to this page.

Penn
michaeli98 Posted - 07/20/2012 : 12:14:41 PM
Hi Penn,

Thank you so much, moving it inside of the for-loop worked like a charm.
Could you please possibly point me to an example of reporting the results? I wanted to report the slope and intercept as new columns in a separate worksheet. Is it possible to copy the x values from the first worksheet, then add the values for the slope and intercept in the new rows as the results are calculated (x(ii), slope, intercept)?

Thanks again for all your suggestions.

Best regards,
Michael
Penn Posted - 07/19/2012 : 10:19:27 PM
Hi,

The problem is when you declare the DataRange in your code. dr is declared out the "for" loop, then for each loop, dr.Add will add pair of XY into this DataRange, and the original one is still there. Then dr.GetData will always get the first pair of XY. You can set a break point to see it.

Please move the line DataRange dr; into the "for" loop, so to make it as local variable, such as

for(int ii=5; ii<nRows; ii++)
{
    DataRange dr;
    dr.Add(...

By the way, the index is based of zero, in your code line dr.Add("X", wks, 1, 0, ii, 0);, it will start from the second row to the (ii+1)th row. According to your description, you wanted to fit frist 5 rows, 6, 7, 8, etc., so maybe you need to change your code as follows, please make sure this point.

for(int ii=4; ii<nRows; ii++)  // ii start from 4 for the first 5 rows
{
    DataRange dr;  // declare inside the loop as local variable
    dr.Add("X", wks, 0, 0, ii, 0);  // x column, from first row to (ii+1)th row
    dr.Add("Y", wks, 0, 1, ii, 1);  // y column
    ...


Penn

The Origin Forum © 2020 Originlab Corporation Go To Top Of Page
Snitz Forums 2000