Introducing ‘propagate’

With this post, I want to introduce the new ‘propagate’ package on CRAN.
It has one single purpose: propagation of uncertainties (“error propagation”). There is already one package on CRAN available for this task, named ‘metRology’ (http://cran.r-project.org/web/packages/metRology/index.html).
‘propagate’ has some additional functionality that some may find useful. The most important functions are:

* propagate: A general function for the calculation of uncertainty propagation by first-/second-order Taylor expansion and Monte Carlo simulation including covariances. Input data can be any symbolic/numeric differentiable expression and data based on replicates, summaries (mean & s.d.) or sampled from a distribution. Uncertainty propagation is based completely on matrix calculus accounting for full covariance structure. Monte Carlo simulation is conducted using multivariate normal or t-distributions with covariance structure. The second-order Taylor approximation is the new aspect, because it is not based on the assumption of linearity around $f(x)$ but uses a second-order polynomial to account for nonlinearities, making heavy use of numerical or symbolical Hessian matrices. Interestingly, the second-order approximation gives results quite similar to the MC simulations!
* plot.propagate: Graphing error propagation with the histograms of the MC simulations and MC/Taylor-based confidence intervals.
* predictNLS: The propagate function is used to calculate the propagated error to the fitted values of a nonlinear model of type nls or nlsLM. Please refer to my post here: https://rmazing.wordpress.com/2013/08/26/predictnls-part-2-taylor-approximation-confidence-intervals-for-nls-models/.
* makeGrad, makeHess, numGrad, numHess are functions to create symbolical or numerical gradient and Hessian matrices from an expression containing first/second-order partial derivatives. These can then be evaluated in an environment with evalDerivs.
* fitDistr: This function fits 21 different continuous distributions by (weighted) NLS to the histogram or kernel density of the Monte Carlo simulation results as obtained by propagate or any other vector containing large-scale observations. Finally, the fits are sorted by ascending AIC.
* random samplers for 15 continuous distributions under one hood, some of them previously unavailable:
Skewed-normal distribution, Generalized normal distributionm, Scaled and shifted t-distribution, Gumbel distribution, Johnson SU distribution, Johnson SB distribution, 3P Weibull distribution, 4P Beta distribution, Triangular distribution, Trapezoidal distribution, Curvilinear Trapezoidal distribution, Generalized trapezoidal distribution, Laplacian distribution, Arcsine distribution, von Mises distribution.
Most of them sample from the inverse cumulative distribution function, but 11, 12 and 15 use a vectorized version of “Rejection Sampling” giving roughly 100000 random numbers/s.

An example (without covariance for simplicity): $\mu_a = 5, \sigma_a = 0.1, \mu_b = 10, \sigma_b = 0.1, \mu_x = 1, \sigma_x = 0.1$
$f(x) = a^{bx}$:
 >DAT <- data.frame(a = c(5, 0.1), b = c(10, 0.1), x = c(1, 0.1)) >EXPR <- expression(a^b*x) >res <- propagate(EXPR, DAT)

 Results from error propagation: Mean.1 Mean.2 sd.1 sd.2 2.5% 97.5% 9765625 10067885 2690477 2739850 4677411 15414333 

Results from Monte Carlo simulation: Mean sd Median MAD 2.5% 97.5% 10072640 2826027 9713207 2657217 5635222 16594123 

The plot reveals the resulting distribution obtained from Monte Carlo simulation:
 >plot(res) 

Seems like a skewed distributions. We can now use fitDistr to find out which comes closest:
 > fitDistr(res$resSIM) Fitting Normal distribution...Done. Fitting Skewed-normal distribution...Done. Fitting Generalized normal distribution...Done. Fitting Log-normal distribution...Done. Fitting Scaled/shifted t- distribution...Done. Fitting Logistic distribution...Done. Fitting Uniform distribution...Done. Fitting Triangular distribution...Done. Fitting Trapezoidal distribution...Done. Fitting Curvilinear Trapezoidal distribution...Done. Fitting Generalized Trapezoidal distribution...Done. Fitting Gamma distribution...Done. Fitting Cauchy distribution...Done. Fitting Laplace distribution...Done. Fitting Gumbel distribution...Done. Fitting Johnson SU distribution...........10.........20.........30.........40.........50 .........60.........70.........80.Done. Fitting Johnson SB distribution...........10.........20.........30.........40.........50 .........60.........70.........80.Done. Fitting 3P Weibull distribution...........10.........20.......Done. Fitting 4P Beta distribution...Done. Fitting Arcsine distribution...Done. Fitting von Mises distribution...Done.$aic Distribution AIC 4 Log-normal -4917.823 16 Johnson SU -4861.960 15 Gumbel -4595.917 19 4P Beta -4509.716 12 Gamma -4469.780 9 Trapezoidal -4340.195 1 Normal -4284.706 5 Scaled/shifted t- -4283.070 6 Logistic -4266.171 3 Generalized normal -4264.102 14 Laplace -4144.870 13 Cauchy -4099.405 2 Skewed-normal -4060.936 11 Generalized Trapezoidal -4032.484 10 Curvilinear Trapezoidal -3996.495 8 Triangular -3970.993 7 Uniform -3933.513 20 Arcsine -3793.793 18 3P Weibull -3783.041 21 von Mises -3715.034 17 Johnson SB -3711.034

 Log-normal wins, which makes perfect sense after using an exponentiation function... Have fun with the package. Comments welcome! Cheers, Andrej Share this:TwitterFacebookLike this:Like Loading... Related This entry was posted on Saturday, August 31st, 2013 at 10:19 pm and is filed under General, R Internals. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site. Post navigation « Previous Post Next Post » 
 
 17 Responses to Introducing ‘propagate’ Paul Prew says: September 2, 2013 at 6:11 am Is EXPR <- expression(a^b*x) in R the same as EXPR <- expression(a^(b*x))? I'm not familiar with the function 'expression'. Thanks for the useful package. Reply anspiess says: September 2, 2013 at 8:13 am Nope: > 3^2*5 [1] 45 > 3^(2*5) [1] 59049 Reply Katharine Mullen says: September 5, 2013 at 6:14 am This is a great package. Congrats on its publication, which significantly extends the framework for uncertainty quantification in R. Reply Karin Rivera says: December 18, 2014 at 12:21 am Hello, I am new using this package, I am working in the uncertainty analysis of the biomass data obtained from a forest inventory (variables: DBH, height and wood density) and my formula for biomass is : 0.112*(wood.density*DBH^2*height)^0.916 Actually I used “propagate” as: DAT <- inventory EXPR <- function(DBH, height, wood.density)0.112*(wood.density*DBH^2*height)^0.916 res <- propagate(EXPR, DAT) my results: Results from error propagation: Mean.1 Mean.2 sd.1 sd.2 2.5% 97.5% 13.82681 -188.77689 247.42702 390.59668 -952.64302 582.66181 Results from Monte Carlo simulation: Mean sd Median MAD 2.5% 97.5% 39.89066744 69.42375773 13.90524871 19.39363104 0.03365433 232.22693809 and I obtained as the best distribution : 3P Weibull with an AIC of: -2874.265 I would like if someone can clear me the meaning of the results from error propagation?? What is MAD??? and also if I need the standar error of the biomass, how can i get it? Thanks and best regards Reply anspiess says: December 19, 2014 at 7:28 am Check your email… Reply Karin Rivera says: December 22, 2014 at 3:39 pm Sorry???? Antoine Stevens says: January 20, 2015 at 4:18 pm Hi, First thank you for this very useful package that helped me already quite a lot. I am using it to compute uncertainties of a variable Y that is function of two variable X1 and X2, both of which being themeselves estimated from two linear regression models. I would like to have your advice on which values I am supposed to use for the estimates of the uncertainties (ie second row in the data.frame supplied to the argument ‘data’ in the ‘propagate’ function) in this case : (1) standard errors as returned by predict(lm.obj, se.fit=T)$se.fit ; (2) residual standard error of my linear models ; or (3) ?. Currently I use (1), which gives much lower uncertainties in Y than solution (2). Is it legitimate? Reply anspiess says: January 21, 2015 at 11:15 am Hi Antoine, so X1 and X2 are actually two response values from two different linear models? And you are plugging them into a new equation to obtain Y? Then you should take the standard errors coming from predict(…)$se.fit. If the equation you are using to obtain Y also needs the the fit parameters of your linear models (slope1, intercept1, slope2, intercept2), then you should also take their parameter errors sqrt(diag(vcov(your_linear_model)). Cheers, Andrej Reply Antoine Stevens says: January 22, 2015 at 11:21 am Thank for your answer. So yes, X1 and X2 are estimated from two different linear models. But Y can be simply derived by multiplying X1 and X2. Using predict(…)$se.fit yields very low uncertainties in Y, because for both linear models used to derive X1 and X2, I have a lots of data (and standard errors tend to zero when n is increasing). This is a bit counter-intuitive to me because the residual standard errors of the two models (sqrt(deviance(lm_fit)/df.residual(lm_fit))) are relatively high. Since predict(…)$se.fit gives the standard error of estimation of mu_x (used for confidence intervals), I was wondering whether I would rather need to compute the standard errors of prediction (used for prediction intervals and are un-compressible with n –> infinity) and propagate these values to compute the uncertainty in Y. anspiess says: January 22, 2015 at 12:46 pm Hi Antoine, yes, of course, on second thought you are totally right, you have to use the “prediction standard deviation” for uncertainty propagation and not the error of the prediction mean. Cheers, Andrej Reply Antoine Stevens says: January 22, 2015 at 1:08 pm Perfect, thanks! Reply Karin says: March 5, 2015 at 6:33 pm hi, Could you help me telling me how can obtain s.e.m after runnig the package? my results after running the package are: Results from error propagation: Mean.1 Mean.2 sd.1 sd.2 2.5% 97.5% 11.38983 -39.16052 217.16837 245.36785 -519.91888 443.65640 Results from Monte Carlo simulation: Mean sd Median MAD 2.5% 37.65579274 70.53757552 11.62218452 16.43243847 0.01784693 97.5% 233.16307179 Thank you for your support! Karin Reply anspiess says: March 8, 2015 at 7:05 pm Hi Karin, either something is wrong with your data, or you used the ‘propagate’ function wrong. Did you use raw data? I’m asking because there is a very strong discrepancy between first-order mean, second-order mean and Monte Carlo mean. Also the first-order s.d. and Monte Carlo s.d. are totally different! Does your data have extreme variance? Or did you supply raw data to ‘propagate’ without setting type = “raw”? Cheers, Andrej Reply Karin says: March 9, 2015 at 10:09 pm Hi Andrej, Thanks for your answer. Actually, I am working with a data from a forest inventory , (variables of each tree measurement: diameter, height, and wood density). in order to obtain the Biomass of the forest I use a general equation proposed by chave(2014): 0.0673*(wood.density*diameter^2*height)^0.976. I would like to obtain the uncertainty equation with my data. Errors in the three variables all result in error in estimating the biomass, This error is propagated to the AGB estimate through the general model. I obtain the descriptive statistics I found a great variance. Par example , for ecozone Selva Baja: > summary(SB_30vd$correc_biomasa) Min. 1st Qu. Median Mean 3rd Qu. Max. 54.03 702.60 1041.00 1558.00 1750.00 21700.00 > sd(SB_30vd$correc_biomasa) [1] 1617.079 > se se(SB_30vd$correc_biomasa) [1] 27.67981 > data_PRO DAT EXPR res res Results from error propagation: Mean.1 Mean.2 sd.1 sd.2 2.5% 97.5% 16639.76 -6833930.64 3045084.91 10251866.51 -26959008.91 13146021.03 Results from Monte Carlo simulation: Mean sd Median MAD 2.5% 97.5% 46458.7920 85999.1315 14469.0721 20510.8366 23.0063 286044.0463 I am not sure if I am using the propagate package in the correct form. I would be appreciate it if you can give me some advices… Thank yo very much Karin Reply anspiess says: March 10, 2015 at 8:06 am Hi Karin, without your data and your function call I cannot be of real help. Also WordPress does some funny formatting of text. I can helip you better if you mail me a.spiess@uke,de, maybe some example data and how you use the ‘propagate’ function. Anyway, your biomass function is highly nonlinear (two powers!), which inflates propagated error quite a lot! Drop me a mail, that should work better… Cheers, Andrej Reply Andrew says: June 22, 2017 at 12:29 pm Hello, Thank you very much for the useful package. When I run the example in this blog, I get the following error message: >plot(res) Error in plot.window(xlim, ylim, “”, …) : need finite ‘ylim’ values I’m running this with Rstudio Version 1.0.143. Reply JUAN CARLOS ANGELES HERNANDEZ says: January 11, 2018 at 3:11 am Hi Andrej I am working on an inventory of enteric methane emission in Mexico using the Tier 2 model from IPCC, this model has several formulas to calculate the methane emissions from dairy and beef cattle. I am using the Propagate package to carry out the propagation of uncertainties of each used formula, for instance: Neta energy of lactation have the following expression: NEl = milk * (1.47 + 0.4 * fat) Inputs milk: mean 21.98 L, s.d. 5.2, PDF(milk)~normal(m, s.d.) Fat: mean 3.5 %, s.d. 0.82, PDF(fat)~normal(m, s.d.) Correlation between milk and fat: 0.5 I am using the following scripts: DATANEt<-data.frame(MILK=c(21.98, 5.2),FAT=c(3.5, 0.82)) EXPNEt<-expression(MILK*(1.47+0.4*FAT)) PROPNEt<-propagate(EXPNEt, DATANEt) PROPNEt plot(PROPNEt) summary(PROPNEt) fitDistr(PROPNEt)$aic I have two questions: 1.There is the possibility to define the distribution of inputs (MILK and FAT) in the FUNCTION propagate or the package assume that its distribution is normal. 2. How a can propagate the uncertainty take account the correlation between the inputs (FAT and MILK) Many thanks and congrats to your amazing package Reply Leave a Reply to Katharine Mullen Cancel reply Enter your comment here... Fill in your details below or click an icon to log in: Email (required) (Address never made public) Name (required) Website You are commenting using your WordPress.com account. ( Log Out /  Change ) You are commenting using your Google account. ( Log Out /  Change ) You are commenting using your Twitter account. ( Log Out /  Change ) You are commenting using your Facebook account. ( Log Out /  Change ) Cancel Connecting to %s var highlander_expando_javascript = function(){ var input = document.createElement( 'input' ), comment = jQuery( '#comment' ); if ( 'placeholder' in input ) { comment.attr( 'placeholder', jQuery( '.comment-textarea label' ).remove().text() ); } // Expando Mode: start small, then auto-resize on first click + text length jQuery( '#comment-form-identity' ).hide(); jQuery( '#comment-form-subscribe' ).hide(); jQuery( '#commentform .form-submit' ).hide(); comment.css( { 'height':'10px' } ).one( 'focus', function() { var timer = setInterval( HighlanderComments.resizeCallback, 10 ) jQuery( this ).animate( { 'height': HighlanderComments.initialHeight } ).delay( 100 ).queue( function(n) { clearInterval( timer ); HighlanderComments.resizeCallback(); n(); } ); jQuery( '#comment-form-identity' ).slideDown(); jQuery( '#comment-form-subscribe' ).slideDown(); jQuery( '#commentform .form-submit' ).slideDown(); }); } jQuery(document).ready( highlander_expando_javascript ); Notify me of new comments via email. Notify me of new posts via email. 
 Search Recent Posts Monte Carlo-based prediction intervals for nonlinear regression Linear regression with random error giving EXACT predefined parameter estimates Introducing: Orthogonal Nonlinear Least-Squares Regression in R Error propagation based on interval arithmetics I’ll take my NLS with weights, please… Archives May 2018 January 2016 January 2015 September 2014 January 2014 August 2013 July 2013 April 2013 February 2013 January 2013 November 2012 July 2012 June 2012 Categories General nonlinear regression R Internals Uncategorized Meta Register Log in Entries feed Comments feed WordPress.com Blogroll R-bloggers __ATA.cmd.push(function() { __ATA.initDynamicSlot({ id: 'atatags-286348-5f0e24bb405a7', location: 140, formFactor: '003', label: { text: 'Advertisements', }, creative: { reportAd: { text: 'Report this ad', }, privacySettings: { text: 'Privacy settings', } } }); }); Blog at WordPress.com. 
 var WPGroHo = {"my_hash":""}; //initialize and attach hovercards to all gravatars jQuery( document ).ready( function( $) { if (typeof Gravatar === "undefined"){ return; } if ( typeof Gravatar.init !== "function" ) { return; } Gravatar.profile_cb = function( hash, id ) { WPGroHo.syncProfileData( hash, id ); }; Gravatar.my_hash = WPGroHo.my_hash; Gravatar.init( 'body', '#wp-admin-bar-my-account' ); }); var HighlanderComments = {"loggingInText":"Logging In\u2026","submittingText":"Posting Comment\u2026","postCommentText":"Post Comment","connectingToText":"Connecting to %s","commentingAsText":"%1$s: You are commenting using your %2$s account.","logoutText":"Log Out","loginText":"Log In","connectURL":"https:\/\/rmazing.wordpress.com\/public.api\/connect\/?action=request","logoutURL":"https:\/\/rmazing.wordpress.com\/wp-login.php?action=logout&_wpnonce=f1ded8733a","homeURL":"https:\/\/rmazing.wordpress.com\/","postID":"407","gravDefault":"identicon","enterACommentError":"Please enter a comment","enterEmailError":"Please enter your email address here","invalidEmailError":"Invalid email address","enterAuthorError":"Please enter your name here","gravatarFromEmail":"This picture will show whenever you leave a comment. Click to customize it.","logInToExternalAccount":"Log in to use details from one of these accounts.","change":"Change","changeAccount":"Change Account","comment_registration":"0","userIsLoggedIn":"","isJetpack":"","text_direction":"ltr"}; ( function () { var setupPrivacy = function() { document.addEventListener( 'DOMContentLoaded', function() { // Minimal Mozilla Cookie library // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie/Simple_document.cookie_framework var cookieLib = window.cookieLib = {getItem:function(e){return e&&decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null},setItem:function(e,o,n,t,r,i){if(!e||/^(?:expires|max\-age|path|domain|secure)$/i.test(e))return!1;var c="";if(n)switch(n.constructor){case Number:c=n===1/0?"; expires=Fri, 31 Dec 9999 23:59:59 GMT":"; max-age="+n;break;case String:c="; expires="+n;break;case Date:c="; expires="+n.toUTCString()}return"rootDomain"!==r&&".rootDomain"!==r||(r=(".rootDomain"===r?".":"")+document.location.hostname.split(".").slice(-2).join(".")),document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(o)+c+(r?"; domain="+r:"")+(t?"; path="+t:"")+(i?"; secure":""),!0}}; var setDefaultOptInCookie = function() { var value = '1YNN'; var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; cookieLib.setItem( 'usprivacy', value, 365 * 24 * 60 * 60, '/', domain ); }; var setCcpaAppliesCookie = function( value ) { var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; cookieLib.setItem( 'ccpa_applies', value, 24 * 60 * 60, '/', domain ); } var maybeCallDoNotSellCallback = function() { if ( 'function' === typeof window.doNotSellCallback ) { return window.doNotSellCallback(); } return false; } var usprivacyCookie = cookieLib.getItem( 'usprivacy' ); if ( null !== usprivacyCookie ) { maybeCallDoNotSellCallback(); return; } var ccpaCookie = cookieLib.getItem( 'ccpa_applies' ); if ( null === ccpaCookie ) { var request = new XMLHttpRequest(); request.open( 'GET', 'https://public-api.wordpress.com/geo/', true ); request.onreadystatechange = function () { if ( 4 === this.readyState ) { if ( 200 === this.status ) { var data = JSON.parse( this.response ); var ccpa_applies = data['region'] && data['region'].toLowerCase() === 'california'; setCcpaAppliesCookie( ccpa_applies ); if ( ccpa_applies ) { if ( maybeCallDoNotSellCallback() ) { setDefaultOptInCookie(); } } } else { setCcpaAppliesCookie( true ); if ( maybeCallDoNotSellCallback() ) { setDefaultOptInCookie(); } } } }; request.send(); } else { if ( ccpaCookie === 'true' ) { if ( maybeCallDoNotSellCallback() ) { setDefaultOptInCookie(); } } } } ); }; if ( window.defQueue && defQueue.isLOHP && defQueue.isLOHP === 2020 ) { defQueue.items.push( setupPrivacy ); } else { setupPrivacy(); } } )(); ( function( $) {$( document.body ).on( 'post-load', function () { if ( typeof __ATA.insertInlineAds === 'function' ) { __ATA.insertInlineAds(); } } ); } )( jQuery ); Post to Cancel window.WPCOM_sharing_counts = {"https:\/\/rmazing.wordpress.com\/2013\/08\/31\/introducing-propagate\/":407}; Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use. To find out more, including how to control cookies, see here: Cookie Policy var actionbardata = {"siteID":"37379885","siteName":"Rmazing","siteURL":"http:\/\/rmazing.wordpress.com","icon":"<img alt='' src='https:\/\/s2.wp.com\/i\/logo\/wpcom-gray-white.png' class='avatar avatar-50' height='50' width='50' \/>","canManageOptions":"","canCustomizeSite":"","isFollowing":"","themeSlug":"pub\/contempt","signupURL":"https:\/\/wordpress.com\/start\/","loginURL":"https:\/\/wordpress.com\/log-in?redirect_to=https%3A%2F%2Frmazing.wordpress.com%2F2013%2F08%2F31%2Fintroducing-propagate%2F&signup_flow=account","themeURL":"","xhrURL":"https:\/\/rmazing.wordpress.com\/wp-admin\/admin-ajax.php","nonce":"19dd088d2a","isSingular":"1","isFolded":"","isLoggedIn":"","isMobile":"","subscribeNonce":"<input type=\"hidden\" id=\"_wpnonce\" name=\"_wpnonce\" value=\"f962339cf7\" \/>","referer":"https:\/\/rmazing.wordpress.com\/2013\/08\/31\/introducing-propagate\/?replytocom=200","canFollow":"1","feedID":"2695909","statusMessage":"","customizeLink":"https:\/\/rmazing.wordpress.com\/wp-admin\/customize.php?url=https%3A%2F%2Frmazing.wordpress.com%2F2013%2F08%2F31%2Fintroducing-propagate%2F%3Freplytocom%3D200","postID":"407","shortlink":"https:\/\/wp.me\/p2wQdn-6z","canEditPost":"","editLink":"https:\/\/wordpress.com\/post\/rmazing.wordpress.com\/407","statsLink":"https:\/\/wordpress.com\/stats\/post\/407\/rmazing.wordpress.com","i18n":{"view":"View site","follow":"Follow","following":"Following","edit":"Edit","login":"Log in","signup":"Sign up","customize":"Customize","report":"Report this content","themeInfo":"Get theme: Contempt","shortlink":"Copy shortlink","copied":"Copied","followedText":"New posts from this site will now appear in your <a href=\"https:\/\/wordpress.com\/read\">Reader<\/a>","foldBar":"Collapse this bar","unfoldBar":"Expand this bar","editSubs":"Manage subscriptions","viewReader":"View site in Reader","viewReadPost":"View post in Reader","subscribe":"Sign me up","enterEmail":"Enter your email address","followers":"","alreadyUser":"Already have a WordPress.com account? <a href=\"https:\/\/wordpress.com\/log-in?redirect_to=https%3A%2F%2Frmazing.wordpress.com%2F2013%2F08%2F31%2Fintroducing-propagate%2F&signup_flow=account\">Log in now.<\/a>","stats":"Stats"}}; var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"en","ajaxurl":"https:\/\/rmazing.wordpress.com\/wp-admin\/admin-ajax.php","nonce":"1119987ee2","display_exif":"1","display_comments":"1","display_geo":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Comment","post_comment":"Post Comment","write_comment":"Write a Comment...","loading_comments":"Loading Comments...","download_original":"View full size <span class=\"photo-size\">{0}<span class=\"photo-size-times\">\u00d7<\/span>{1}<\/span>","no_comment_text":"Please be sure to submit some text with your comment.","no_comment_email":"Please provide an email address to comment.","no_comment_author":"Please provide your name to comment.","comment_post_error":"Sorry, but there was an error posting your comment. Please try again later.","comment_approved":"Your comment was approved.","comment_unapproved":"Your comment is in moderation.","camera":"Camera","aperture":"Aperture","shutter_speed":"Shutter Speed","focal_length":"Focal Length","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https:\/\/rmazing.wordpress.com\/wp-login.php?redirect_to=https%3A%2F%2Frmazing.wordpress.com%2F2013%2F08%2F31%2Fintroducing-propagate%2F","blog_id":"37379885","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"],"local_comments_commenting_as":"<fieldset><label for=\"email\">Email (Required)<\/label> <input type=\"text\" name=\"email\" class=\"jp-carousel-comment-form-field jp-carousel-comment-form-text-field\" id=\"jp-carousel-comment-form-email-field\" \/><\/fieldset><fieldset><label for=\"author\">Name (Required)<\/label> <input type=\"text\" name=\"author\" class=\"jp-carousel-comment-form-field jp-carousel-comment-form-text-field\" id=\"jp-carousel-comment-form-author-field\" \/><\/fieldset><fieldset><label for=\"url\">Website<\/label> <input type=\"text\" name=\"url\" class=\"jp-carousel-comment-form-field jp-carousel-comment-form-text-field\" id=\"jp-carousel-comment-form-url-field\" \/><\/fieldset>","reblog":"Reblog","reblogged":"Reblogged","reblog_add_thoughts":"Add your thoughts here... (optional)","reblogging":"Reblogging...","post_reblog":"Post Reblog","stats_query_args":"blog=37379885&v=wpcom&tz=2&user_id=0&subd=rmazing","is_public":"1","reblog_enabled":""}; var sharing_js_options = {"lang":"en","counts":"1","is_stats_active":"1"}; var windowOpen; jQuery( document.body ).on( 'click', 'a.share-twitter', function() { // If there's another sharing window open, close it. if ( 'undefined' !== typeof windowOpen ) { windowOpen.close(); } windowOpen = window.open( jQuery( this ).attr( 'href' ), 'wpcomtwitter', 'menubar=1,resizable=1,width=600,height=350' ); return false; }); var windowOpen; jQuery( document.body ).on( 'click', 'a.share-facebook', function() { // If there's another sharing window open, close it. if ( 'undefined' !== typeof windowOpen ) { windowOpen.close(); } windowOpen = window.open( jQuery( this ).attr( 'href' ), 'wpcomfacebook', 'menubar=1,resizable=1,width=600,height=400' ); return false; }); // <![CDATA[ (function() { try{ if ( window.external &&'msIsSiteMode' in window.external) { if (window.external.msIsSiteMode()) { var jl = document.createElement('script'); jl.type='text/javascript'; jl.async=true; jl.src='/wp-content/plugins/ie-sitemode/custom-jumplist.php'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(jl, s); } } }catch(e){} })(); // ]]> %d bloggers like this: _tkq = window._tkq || []; _stq = window._stq || []; _tkq.push(['storeContext', {'blog_id':'37379885','blog_tz':'2','user_lang':'en','blog_lang':'en','user_id':'0'}]); _stq.push(['view', {'blog':'37379885','v':'wpcom','tz':'2','user_id':'0','post':'407','subd':'rmazing'}]); _stq.push(['extra', {'crypt':'UE5XaGUuOTlwaD85flAmcm1mcmZsaDhkV11YdWFnNncxc1tjZG9XVXhRREQ/V0xPZ1hKXy8xNFVXSj9jVnIteUlFc3ddRUw0SjZjfGJdQml5SlBYclRxaXguUEtnZFIxMWRVbC1HVFNycE9KZ3VVQ1c3M34zfndWK3o0QSVsbGh5PzJkeUREd3U2SiV0W2E/M0EvN0YlPUkxP0ItbFY5Z0FwfHclXzRBYmwsV1MmTkxjZzNRTXB4QnAzXWVKU3BTc0FLQm9SN0tTOT9XblJVZzdFY3FPb21laTBrOG9FdzUsWV9XQT9jblQsMlNGZix5NlJxZGxIMCY5WGZBS1dvSzd8aWEyUGY/NkQ='}]); _stq.push([ 'clickTrackerInit', '37379885', '407' ]); if ( 'object' === typeof wpcom_mobile_user_agent_info ) { wpcom_mobile_user_agent_info.init(); var mobileStatsQueryString = ""; if( false !== wpcom_mobile_user_agent_info.matchedPlatformName ) mobileStatsQueryString += "&x_" + 'mobile_platforms' + '=' + wpcom_mobile_user_agent_info.matchedPlatformName; if( false !== wpcom_mobile_user_agent_info.matchedUserAgentName ) mobileStatsQueryString += "&x_" + 'mobile_devices' + '=' + wpcom_mobile_user_agent_info.matchedUserAgentName; if( wpcom_mobile_user_agent_info.isIPad() ) mobileStatsQueryString += "&x_" + 'ipad_views' + '=' + 'views'; if( "" != mobileStatsQueryString ) { new Image().src = document.location.protocol + '//pixel.wp.com/g.gif?v=wpcom-no-pv' + mobileStatsQueryString + '&baba=' + Math.random(); } }