Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

Custom Calculation Script - Standard Deviation

Explorer ,
Jun 06, 2017 Jun 06, 2017

I am having trouble creating a Custom calculation script in my Adobe Acrobat XI Standard. I have a table with fields row_1, row_2, row_3, row_4, row_5, row_6, row_7, row_8, row_9, row_10, row_11, row_12, row_13, row_14, row_15. I have a field that already calculates the mean, that field name is mean. So far I have been able to create this but it does not work:

sqrt(((((row_1-mean)^2)+((row_2-mean)^2)+((row_3-mean)^2)+((row_4-mean)^2)+((row_5-mean)^2)+((row_6-mean)^2)+((row_7-mean)^2)+((row_8-mean)^2)+((row_9-mean)^2)+((row_10-mean)^2)+((row_11-mean)^2)+((row_12-mean)^2)+((row_13-mean)^2)+((row_14-mean)^2)+((row_15-mean)^2)))/15)

TOPICS
Acrobat SDK and JavaScript , Windows
4.2K
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jun 06, 2017 Jun 06, 2017

You must change your code.

E.g. you will get value of field row_1 with:

this.getField("row_1").value

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 06, 2017 Jun 06, 2017

What must I change it to? I am stuck. row_1, row_2, etc. are imputed values that the user manually enters. My issue is I need to find an equation that will work in Adobe Acrobat that finds standard deviation of a set of numbers. Do you know how to do this?

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jun 06, 2017 Jun 06, 2017

And here you can learn how to perform basic mathematical operations (like square root and power) in JS: JavaScript Math Object

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 06, 2017 Jun 06, 2017

My issue isn't writing the actually code. I just cannot seem to get any of them to actually work within Adobe Acrobat. For example, if I want the Standard Deviation of the field name mean. Example: stdev(mean). This will not work in the Custom calculation script. Can you please help me. am I missing something in front of the code?

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jun 06, 2017 Jun 06, 2017

Why would it work? Did you create a function called stdev? There's no such function built-in to JavaScript or Acrobat, so there's no reason to assume it will magically work...

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 07, 2017 Jun 07, 2017

Currently it works! I am not sure what you mean! stdev() is a standard JavaScript function.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jun 07, 2017 Jun 07, 2017

AFAIK, it's not. Show me where it's documented...

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 06, 2017 Jun 06, 2017

Right now this is working separately.

In one form field(Simplified field notation) named MEAN_2 I have:

((((row_1-mean)*(row_1-mean))+((row_2-mean)*(row_2-mean))+((row_3-mean)*(row_3-mean))+((row_4-mean)*(row_4-mean))+((row_5-mean)*(row_5-mean))+((row_6-mean)*(row_6-mean))+((row_7-mean)*(row_7-mean))+((row_8-mean)*(row_8-mean))+((row_9-mean)*(row_9-mean))+((row_10-mean)*(row_10-mean))+((row_11-mean)*(row_11-mean))+((row_12-mean)*(row_12-mean))+((row_13-mean)*(row_13-mean))+((row_14-mean)*(row_14-mean))+((row_15-mean)*(row_15-mean)))/15)

In another form field(Custom calculation script) I have:

event.value = Math.sqrt(this.getField("MEAN_2").value) ;

The second one correctly outputs the Standard deviation of the mean. But, I would like to not have two form fields. All I need is the standard deviation of the form field mean. But for some reason stdev(mean) wont work.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jun 06, 2017 Jun 06, 2017

In the simplified field notation you can only use the operators + - * /

You must change the whole code to JavaScript.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 07, 2017 Jun 07, 2017

Hi Bernd. Do you have any idea of how I could change the entire thing to JavaScript?

So far, I have a "Value is the average" in one form field which creates the mean, this form field is labeled 'mean'. In the next form field I have a "Simplified field notation" : ((((row_1-mean)*(row_1-mean))+((row_2-mean)*(row_2-mean))+((row_3-mean)*(row_3-mean))+((row_4-mean)*(row_4-mean))+((row_5-mean)*(row_5-mean))+((row_6-mean)*(row_6-mean))+((row_7-mean)*(row_7-mean))+((row_8-mean)*(row_8-mean))+((row_9-mean)*(row_9-mean))+((row_10-mean)*(row_10-mean))+((row_11-mean)*(row_11-mean))+((row_12-mean)*(row_12-mean))+((row_13-mean)*(row_13-mean))+((row_14-mean)*(row_14-mean))+((row_15-mean)*(row_15-mean)))/15). This is part of the equation to find the standard deviation, this second form field is labeled 'MEAN_2'. In the third and final form field I created a "Custom calculation script" : event.value = Math.sqrt(this.getField("MEAN_2").value) ;. That last script takes the square root of the form field MEAN_2, thus giving me the standard deviation. Any idea of how I can combine them all into one?

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jun 07, 2017 Jun 07, 2017

One sample for standard deviation:

Java script for standard deviation (JavaScript)

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 07, 2017 Jun 07, 2017

Bernd-

This is what I have come up with thus far:

var MyValues = new Array();

var MyFields = new Array("row_1", "row_2", "row_3", "row_4", "row_5");

var oField;

var nField;

for(var i = 0; i < MyFields.length; i++)

{

  nField = '';

  nField = GetField(this, MyFields).valueAsString;

  if(nField != "") MyValues.push(Number(nField));

}

event.value = standardDeviation(MyValues);

Any help is much appreciated.

Thanks,

Michelle

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 07, 2017 Jun 07, 2017

Bernd-

I found this. But it doesn't work right now. Am I listing the row_'s wrong? Do I have to add something before I list them?

var average = this.getField("mean").value;
var v = 0;
var fieldName = "row_1, row_2, row_3, row_4, row_5, row_6, row_7, row_8, row_9, row_10, row_11, row_12, row_13, row_14, row_15"; 
var s = 0;
var sd = 0;
n = 15; //number of fields

for (var i = 1; i < n+1; i++) {
    v = this.getField(fieldName + i).value;
    s = s + Math.pow((v - average), 2);
}

sd = Math.sqrt(s / n); //standar deviation
event.value = sd;

Thanks,

Michelle

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 07, 2017 Jun 07, 2017

This won't work either:

var average = this.getField("mean").value;
var v = 0;
var fieldNames = new Array("row_1", "row_2", "row_3", "row_4", "row_5", "row_6", "row_7", "row_8", "row_9", "row_10", "row_11", "row_12", "row_13", "row_14", "row_15"); 
var s = 0;
var sd = 0;
n = 15; //number of fields

for (var i = 1; i < n+1; i++) {
    v = this.getField(fieldNames + i).value;
    s = s + Math.pow((v - average), 2);
}

sd = Math.sqrt(s / n); //standar deviation
event.value = sd;

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jun 07, 2017 Jun 07, 2017

Look at the sample. It doesn't use an array. You must use:

var fieldName = "row_";

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 07, 2017 Jun 07, 2017

Hi Bernd,

It doesn't work with just var fieldname="row_";

var average = this.getField("mean").value;
var v = 0;
var fieldName = "row_";
var s = 0;
var sd = 0;
n = 15; //number of fields

for (var i = 1; i < n+1; i++) {
    v = this.getField(fieldNames + i).value;
    s = s + Math.pow((v - average), 2);
}

sd = Math.sqrt(s / n); //standar deviation
event.value = sd;

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 07, 2017 Jun 07, 2017

This doesn't work either:

var average = this.getField("mean").value;
var v = 0;
var fieldName = ("row_1", "row_2", "row_3", "row_4", "row_5", "row_6", "row_7", "row_8", "row_9", "row_10", "row_11", "row_12", "row_13", "row_14", "row_15");
var s = 0;
var sd = 0;
n = 15; //number of fields

for (var i = 1; i < n+1; i++) {
    v = this.getField(fieldNames + i).value;
    s = s + Math.pow((v - average), 2);
}

sd = Math.sqrt(s / n); //standar deviation
event.value = sd;

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Jun 07, 2017 Jun 07, 2017

Open Acrobat's JavaScript Console and see if there are any errors.

You use the <Ctrl/Options> +"J" key combination.

It appears line 9 of the script is trying to access a field that does not exist.

You need to make a couple of changes. Fix the name of the array and fix the index value for walking the array's elements.

Try:

var average = this.getField("mean").value;
var v = 0;
var fieldName = new Array("row_1", "row_2", "row_3", "row_4", "row_5", "row_6", "row_7", "row_8", "row_9", "row_10", "row_11", "row_12", "row_13", "row_14", "row_15");
var s = 0;
var sd = 0;
n = 15; //number of fields

for (var i = 0; i < n; i++) {
    v = this.getField(fieldName).value;
    s = s + Math.pow((v - average), 2);
}

sd = Math.sqrt(s / n); //standar deviation
event.value = sd;

If your values are small and there is very little variation, it is possible that your standard deviation maybe close to zero and the calculation will result in a value expressed in scientific notation which for a field formatted as a number will throw an error about value not matching the field's format.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 08, 2017 Jun 08, 2017

gkaiseril -

You are amazing!!! It works, thanks so much.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 08, 2017 Jun 08, 2017

Update:

This is the current script I have and it works properly to calculate the Population Standard Deviation:

var average = this.getField("mean").value;
var v = 0;
var fieldName = new Array("row_1", "row_2", "row_3", "row_4", "row_5", "row_6", "row_7", "row_8", "row_9", "row_10", "row_11", "row_12", "row_13", "row_14", "row_15");
var s = 0;
var sd = 0;
n = 15; //number of fields

for (var i = 0; i < n; i++) {
    v = this.getField(fieldName).value;
    s = s + Math.pow((v - average), 2);
}

sd = Math.sqrt(s / n); //standar deviation
event.value = sd;

However, I need the Sample Standard Deviation. Can anyone help me?

Thanks,

Michelle

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jun 09, 2017 Jun 09, 2017

sd = Math.sqrt(s / (n - 1));

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Jun 09, 2017 Jun 09, 2017
LATEST

Instead of dividing by the population n one divides by the sample n - 1.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines