Re: [R] function to convert lm model to LaTeX equation
Ista Zahn wrote: Dear list, I've tried several times to wrap my head around the Design library, without much success. It does some really nice things, but I'm often uncomfortable because I don't understand exactly what it's doing. Anyway, one thing I really like is the latex.ols() function, which converts an R linear model formula to a LaTeX equation. So, I started writing a latex.lm() function (not actually using classes at this point, I just named it that for consistency). This turned out to be easy enough for simple cases (see code below), but now I'm wondering a) if anyone knows of existing functions that do this (again, for lm() models, I know I'm reinventing the wheel in as far as the Design library goes), or if not, b) if anyone has suggestions for improving the function below. Thanks, Ista ### Function to create LaTeX formula from lm() model. Needs amsmath package in LaTeX. ### latex.lm - function(object, file=, math.env=c($,$), estimates=none, abbreviate = TRUE, abbrev.length=8, digits=3) { # Get and format IV names co - c(Int, names(object$coefficients)[-1]) co.n - gsub(p.*), , co) if(abbreviate == TRUE) { co.n - abbreviate(gsub(p.*), , co), minlength=abbrev.length) } # Get and format DV m.y - strsplit((as.character(object$call[2])), ~ )[[1]][1] # Write coefficent labels b.x - paste(\\beta_{, co.n ,}, sep=) # Write error term e - \\epsilon_i # Format coefficint x variable terms m.x - sub(}Int,}, paste(b.x, co.n, + , sep=, collapse=)) # If inline estimates convert coefficient labels to values if(estimates == inline) { m.x - sub(Int, , paste(round(object$coefficients,digits=digits), co.n, + , sep=, collapse=)) m.x - gsub(\\+ \\-, -, m.x) } # Format regression equation eqn - gsub(:, \\times , paste(math.env[1], m.y, = , m.x, e, sep=)) # Write the opening math mode tag and the model cat(eqn, file=file) # If separae estimates format estimates and write them below the model if(estimates == separate) { est - gsub(:, \\times , paste(b.x, = , round(object$coefficients, digits=digits), , , sep=, collapse=)) cat(, \n \\text{where }, substr(est, 1, (nchar(est)-2)), file=file) } # Write the closing math mode tag cat(math.env[2], \n, file=file) } # END latex.lm Xvar1 - rnorm(20) Xvar2 - rnorm(20) Xvar3 - factor(rep(c(A,B),10)) Y.var - rnorm(20) D - data.frame(Xvar1, Xvar2, Xvar3, Y.var) x1 - lm(Y.var ~ pol(Xvar1, 3) + Xvar2*Xvar3, data=D) latex.lm(x1) It's not reinventing the wheel, in the sense that you are not attempting to handle the most needed features (simplifying regression splines and factoring out interaction terms with brackets). I don't think you followed the posting guide though. You didn't state your exact problem with Design and you didn't include any code. Also note that the Design package is replaced with the rms package although latex features have not changed. -- Frank E Harrell Jr Professor and Chair School of Medicine Department of Biostatistics Vanderbilt University __ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
Re: [R] function to convert lm model to LaTeX equation
On Sun, Oct 18, 2009 at 9:09 AM, Frank E Harrell Jr f.harr...@vanderbilt.edu wrote: Ista Zahn wrote: Dear list, I've tried several times to wrap my head around the Design library, without much success. It does some really nice things, but I'm often uncomfortable because I don't understand exactly what it's doing. Anyway, one thing I really like is the latex.ols() function, which converts an R linear model formula to a LaTeX equation. So, I started writing a latex.lm() function (not actually using classes at this point, I just named it that for consistency). This turned out to be easy enough for simple cases (see code below), but now I'm wondering a) if anyone knows of existing functions that do this (again, for lm() models, I know I'm reinventing the wheel in as far as the Design library goes), or if not, b) if anyone has suggestions for improving the function below. Thanks, Ista ### Function to create LaTeX formula from lm() model. Needs amsmath package in LaTeX. ### latex.lm - function(object, file=, math.env=c($,$), estimates=none, abbreviate = TRUE, abbrev.length=8, digits=3) { # Get and format IV names co - c(Int, names(object$coefficients)[-1]) co.n - gsub(p.*), , co) if(abbreviate == TRUE) { co.n - abbreviate(gsub(p.*), , co), minlength=abbrev.length) } # Get and format DV m.y - strsplit((as.character(object$call[2])), ~ )[[1]][1] # Write coefficent labels b.x - paste(\\beta_{, co.n ,}, sep=) # Write error term e - \\epsilon_i # Format coefficint x variable terms m.x - sub(}Int,}, paste(b.x, co.n, + , sep=, collapse=)) # If inline estimates convert coefficient labels to values if(estimates == inline) { m.x - sub(Int, , paste(round(object$coefficients,digits=digits), co.n, + , sep=, collapse=)) m.x - gsub(\\+ \\-, -, m.x) } # Format regression equation eqn - gsub(:, \\times , paste(math.env[1], m.y, = , m.x, e, sep=)) # Write the opening math mode tag and the model cat(eqn, file=file) # If separae estimates format estimates and write them below the model if(estimates == separate) { est - gsub(:, \\times , paste(b.x, = , round(object$coefficients, digits=digits), , , sep=, collapse=)) cat(, \n \\text{where }, substr(est, 1, (nchar(est)-2)), file=file) } # Write the closing math mode tag cat(math.env[2], \n, file=file) } # END latex.lm Xvar1 - rnorm(20) Xvar2 - rnorm(20) Xvar3 - factor(rep(c(A,B),10)) Y.var - rnorm(20) D - data.frame(Xvar1, Xvar2, Xvar3, Y.var) x1 - lm(Y.var ~ pol(Xvar1, 3) + Xvar2*Xvar3, data=D) latex.lm(x1) It's not reinventing the wheel, in the sense that you are not attempting to handle the most needed features (simplifying regression splines and factoring out interaction terms with brackets). I don't think you followed the posting guide though. You didn't state your exact problem with Design and you didn't include any code. Also note that the Design package is replaced with the rms package although latex features have not changed. Thank you for your response Prof. Harrell. Sorry my original post didn't meet the guidelines -- it was poorly worded I'm afraid. The question was not about the Design package, but about how to represent a lm() model as a LaTeX equation, and specifically whether anyone had already written code for this task, and if not how the function I wrote could be improved. Thank you for you're suggestions about needing to handle regression splines and factoring out interaction terms, that's very helpful. Thanks again, Ista -- Frank E Harrell Jr Professor and Chair School of Medicine Department of Biostatistics Vanderbilt University -- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org __ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
[R] function to convert lm model to LaTeX equation
Dear list, I've tried several times to wrap my head around the Design library, without much success. It does some really nice things, but I'm often uncomfortable because I don't understand exactly what it's doing. Anyway, one thing I really like is the latex.ols() function, which converts an R linear model formula to a LaTeX equation. So, I started writing a latex.lm() function (not actually using classes at this point, I just named it that for consistency). This turned out to be easy enough for simple cases (see code below), but now I'm wondering a) if anyone knows of existing functions that do this (again, for lm() models, I know I'm reinventing the wheel in as far as the Design library goes), or if not, b) if anyone has suggestions for improving the function below. Thanks, Ista ### Function to create LaTeX formula from lm() model. Needs amsmath package in LaTeX. ### latex.lm - function(object, file=, math.env=c($,$), estimates=none, abbreviate = TRUE, abbrev.length=8, digits=3) { # Get and format IV names co - c(Int, names(object$coefficients)[-1]) co.n - gsub(p.*), , co) if(abbreviate == TRUE) { co.n - abbreviate(gsub(p.*), , co), minlength=abbrev.length) } # Get and format DV m.y - strsplit((as.character(object$call[2])), ~ )[[1]][1] # Write coefficent labels b.x - paste(\\beta_{, co.n ,}, sep=) # Write error term e - \\epsilon_i # Format coefficint x variable terms m.x - sub(}Int,}, paste(b.x, co.n, + , sep=, collapse=)) # If inline estimates convert coefficient labels to values if(estimates == inline) { m.x - sub(Int, , paste(round(object$coefficients,digits=digits), co.n, + , sep=, collapse=)) m.x - gsub(\\+ \\-, -, m.x) } # Format regression equation eqn - gsub(:, \\times , paste(math.env[1], m.y, = , m.x, e, sep=)) # Write the opening math mode tag and the model cat(eqn, file=file) # If separae estimates format estimates and write them below the model if(estimates == separate) { est - gsub(:, \\times , paste(b.x, = , round(object$coefficients, digits=digits), , , sep=, collapse=)) cat(, \n \\text{where }, substr(est, 1, (nchar(est)-2)), file=file) } # Write the closing math mode tag cat(math.env[2], \n, file=file) } # END latex.lm Xvar1 - rnorm(20) Xvar2 - rnorm(20) Xvar3 - factor(rep(c(A,B),10)) Y.var - rnorm(20) D - data.frame(Xvar1, Xvar2, Xvar3, Y.var) x1 - lm(Y.var ~ pol(Xvar1, 3) + Xvar2*Xvar3, data=D) latex.lm(x1) -- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org __ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.