Использование функции round или sprintf для уравнения регрессии в ggpmisc и dev=tikz

Как я могу управлять числовым отображением в уравнении регрессии с помощью функции round или sprintf? Я также не мог понять, как использовать dev="tikz" при использовании eq.with.lhs = "hat(Y)~=~".

library(ggplot2)
library(ggpmisc)

# generate artificial data
set.seed(4321)
x <- 1:100
y <- (x + x^2 + x^3) + rnorm(length(x), mean = 0, sd = mean(x^3) / 4)
my.data <- data.frame(x, 
                      y, 
                      group = c("A", "B"), 
                      y2 = y * c(0.5,2),
                      block = c("a", "a", "b", "b"))

str(my.data)

# plot
ggplot(data = my.data, mapping=aes(x = x, y = y2, colour = group)) +
        geom_point() +
        geom_smooth(method = "lm", se =  FALSE, formula = y ~ poly(x=x, degree = 2, raw = TRUE)) +
        stat_poly_eq(
                       mapping     = aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~"))
                     , data        = NULL
                     , geom        = "text"
                     , formula     = y ~ poly(x, 2, raw = TRUE)
                     , eq.with.lhs = "hat(Y)~`=`~"
                     , eq.x.rhs    = "X"
                     , label.x     = 0
                     , label.y     = 2e6
                     , vjust       = c(1.2, 0)
                     , position    = "identity"
                     , na.rm       = FALSE
                     , show.legend = FALSE
                     , inherit.aes = TRUE
                     , parse       = TRUE
                     ) +
        theme_bw()

введите здесь описание изображения


person MYaseen208    schedule 15.05.2016    source источник
comment
Между round и sprintf есть важное различие. Первый округляет значение из-за математических правил, а второй просто сокращает число из-за указанной структуры. Я предпочитаю sprintf, потому что это метод вывода значений.   -  person FlorianSchunke    schedule 16.05.2016
comment
Что вы имеете в виду под округлением? Вы имеете в виду физическое округление коэффициентов (например, 67,5 до 68) или адаптацию функции так, чтобы она была ближе к вставляемой функции (минус шум). Первый будет вопросом программирования, а второй - более математическим по своей природе. Также было бы более понятно задавать только один вопрос на вопрос (было бы легко создать отдельный минимальный рабочий пример для вопроса о dev=tikz). В противном случае у вас может возникнуть ситуация, когда вы хотите принять два ответа, поскольку каждый из них отвечает только на одну часть.   -  person takje    schedule 22.05.2016
comment
Пункт о двух вопросах в одном очень хороший. Во всяком случае, мой ответ теперь отвечает обоим. round и signif возвращают числовые значения, sprintf возвращает символьное значение. В зависимости от спецификации формата sprintfбудет использовать эквивалент round или signif для преобразования числа.   -  person Pedro Aphalo    schedule 23.05.2016


Ответы (2)


1) Приведенный ниже код отвечает на часть dev="tikz" вопроса, если используется с «ggpmisc» (версия >= 0.2.9)

\documentclass{article}

\begin{document}

<<setup, include=FALSE, cache=FALSE>>=
library(knitr)
opts_chunk$set(fig.path = 'figure/pos-', fig.align = 'center', fig.show = 'hold',
               fig.width = 7, fig.height = 6, size = "footnotesize", dev="tikz")
@


<<>>=
library(ggplot2)
library(ggpmisc)
@

<<>>=
# generate artificial data
set.seed(4321)
x <- 1:100
y <- (x + x^2 + x^3) + rnorm(length(x), mean = 0, sd = mean(x^3) / 4)
my.data <- data.frame(x,
                      y,
                      group = c("A", "B"),
                      y2 = y * c(0.5,2),
                      block = c("a", "a", "b", "b"))

str(my.data)
@

<<>>=
# plot
ggplot(data = my.data, mapping=aes(x = x, y = y2, colour = group)) +
  geom_point() +
  geom_smooth(method = "lm", se =  FALSE, 
              formula = y ~ poly(x=x, degree = 2, raw = TRUE)) +
  stat_poly_eq(
    mapping     = aes(label = paste("$", ..eq.label.., "$\\ \\ \\ $",
                       ..rr.label.., "$", sep = ""))
    , geom        = "text"
    , formula     = y ~ poly(x, 2, raw = TRUE)
    , eq.with.lhs = "\\hat{Y} = "
    , output.type = "LaTeX"
   ) +
  theme_bw()
@

\end{document}

введите здесь описание изображения

Спасибо за предложение этого улучшения, я обязательно найду ему применение и для себя!

2) Ответьте на roundи sprintf часть вопроса. Вы не можете использовать round или sprintf для изменения количества цифр, stat_poly_eq в настоящее время использует signif с тремя значащими цифрами в качестве аргумента, применяемого ко всему вектору коэффициентов. Если вам нужен полный контроль, вы можете использовать другую статистику, stat_fit_glance, которая также находится в ggpmisc (>= 0.2.8), которая использует broom:glance для внутреннего использования. Это гораздо более гибко, но вам придется самостоятельно позаботиться обо всем форматировании в вызове aes. На данный момент есть одна загвоздка: broom::glance не работает правильно с poly, вам нужно будет явно написать уравнение полинома, чтобы передать его в качестве аргумента formula.

person Pedro Aphalo    schedule 22.05.2016
comment
Пожалуйста, см. соответствующий вопрос здесь . Спасибо - person MYaseen208; 05.08.2016

Мясеен208,

Вот обходной путь для проблемы с созданием вывода .tex с ggpmisc::stat_poly_eq(). Мне удалось подтвердить, что в настоящее время вы не можете комбинировать stat_poly_eq() и "hat(Y)~=~" с library(tikzDevice) для создания латексного вывода .tex. Однако я предоставил решение для создания правильного вывода .tex в промежуточный период.

Педро Афало, создатель пакета ggpmisc, очень любезно принял запрос на улучшение ggpmisc::stat_poly_eq(). Согласно запрошенному отчету об ошибке, поданному и указанному ниже.

Пример кода:

Следующий код создаст графику без символа шляпы:

# Load required packages
requiredPackages <- requiredPackages <- c("ggplot2", "ggpmisc", "tikzDevice", "latex2exp")

# ipak - Check to see if the package is installed, if not install and then load...
ipak <- function(pkg)
{
  new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
  if (length(new.pkg))
    install.packages(new.pkg, dependencies = TRUE)
  sapply(pkg, require, character.only = TRUE)
}

ipak(requiredPackages)

# generate artificial data
set.seed(4321)
x <- 1:100
y <- (x + x ^ 2 + x ^ 3) + rnorm(length(x), mean = 0, sd = mean(x ^ 3) / 4)
my.data <- data.frame(
  x, y,
  group = c("A", "B"),
  y2 = y * c(0.5, 2),
  block = c("a", "a", "b", "b")
)

# Define Formaula..
formulaDefined <- (y ~ (poly(x = x, degree = 2, raw = TRUE)))

gp <- ggplot(data = my.data, mapping = aes(x = x, y = y2, colour = group))
gp <- gp + geom_point()
gp <- gp + geom_smooth(method = "lm", se =  FALSE, formula = formulaDefined )
gp <- gp + stat_poly_eq(
  aes(label = paste(..eq.label.., "~~~", ..rr.label.., sep = "")),
#  eq.with.lhs = "italic(hat(y))~`=`~",
  formula     = formulaDefined,
  geom        = "text",
  label.x     = 0,
  label.y     = 2e6,
  vjust       = c(1.2, 0),
  position    = "identity",
  na.rm       = FALSE,
  show.legend = FALSE,
  inherit.aes = TRUE,
  parse       = TRUE)
gp <- gp + theme_bw()
gp

введите здесь описание изображения

теперь мы можем изменить этот код и его tikz output, чтобы получить желаемый результат:

Кодовое решение Tikz

Первым шагом является изменение кода для вывода требуемого файла .tex. После этого мы можем использовать gsub() для поиска необходимых строк в файле .tex и заменить {\itshape y}; на {\^{y}}; [строки 646 и 693].

# Load required packages
requiredPackages <- requiredPackages <- c("ggplot2", "ggpmisc", "tikzDevice", "latex2exp")

# ipak - Check to see if the package is installed, if not install and then load...
ipak <- function(pkg)
{
  new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
  if (length(new.pkg))
    install.packages(new.pkg, dependencies = TRUE)
  sapply(pkg, require, character.only = TRUE)
}

ipak(requiredPackages)

# generate artificial data
set.seed(4321)
x <- 1:100
y <- (x + x ^ 2 + x ^ 3) + rnorm(length(x), mean = 0, sd = mean(x ^ 3) / 4)
my.data <- data.frame(
  x, y,
  group = c("A", "B"),
  y2 = y * c(0.5, 2),
  block = c("a", "a", "b", "b")
)

setwd("~/dev/stackoverflow/37242863")

texFile <- "./test2.tex"
# setup tex output file
tikz(file = texFile, width = 5.5, height = 5.5)

#Define Formaula..
formulaDefined <- (y ~ (poly(x = x, degree = 2, raw = TRUE)))

gp <- ggplot(data = my.data, mapping = aes(x = x, y = y2, colour = group))
gp <- gp + geom_point()
gp <- gp + geom_smooth(method = "lm", se =  FALSE, formula = formulaDefined )
gp <- gp + stat_poly_eq(
  aes(label = paste(..eq.label.., "~~~", ..rr.label.., sep = "")),
#  eq.with.lhs = "italic(hat(y))~`=`~",
  formula     = formulaDefined,
  geom        = "text",
  label.x     = 0,
  label.y     = 2e6,
  vjust       = c(1.2, 0),
  position    = "identity",
  na.rm       = FALSE,
  show.legend = FALSE,
  inherit.aes = TRUE,
  parse       = TRUE)
gp <- gp + theme_bw()
gp
dev.off()

## OK, now we can take the test.txt file and replace the relevant attributes to
## add the hat back to the y in the .tex output file...

texOutputFile <- readLines(texFile)
y <- gsub('itshape y', '^{y}', texOutputFile )
cat(y, file=texFile, sep="\n")

Структура тестов Tex:

Чтобы протестировать решение, мы можем создать небольшой тестовый жгут из латекса. Вы можете загрузить этот файл в RStudio [t1.tex] и затем скомпилировать его; он вытянет test2.text, сгенерированный с помощью представленного ранее кода.

обратите внимание RStudio — отличная платформа для скомпилированного латексного вывода из R.

\documentclass{article}

\usepackage{tikz}

\begin{document}

\begin{figure}[ht]
\input{test2.tex}
\caption{Sample output from tikzDevice 2}
\end{figure}

\end{document}

результат:

введите здесь описание изображения

Альтернативное решение

Другим вариантом может быть использование geom_text(). Недостатком этого подхода является то, что вам нужно самостоятельно написать уравнение линии регрессии. Это обсуждалось в вашем предыдущем сообщении: Добавление уравнения линии регрессии и R2 на графике

Если вам нужно подробное решение [с geom_text], отправьте мне пинг. Другой вариант — отправить отчет об ошибке с помощью ggpmisc [сделано мной] и посмотреть, обратился ли автор уже или может обратиться.

Отчет об ошибке: https://bitbucket.org/aphalo/ggpmisc/issues/1/stat_poly_eq-fails-when-used-with

Я надеюсь, что вышеизложенное поможет.

person Technophobe01    schedule 22.05.2016
comment
@pedro-aphalo Есть ли лучший способ сделать это с помощью ggpmisc? - person Technophobe01; 22.05.2016
comment
Я изучу эту проблему для следующего выпуска. Я предполагаю, что нужно будет выводить действительный код LaTeX вместо выражения R. Пройдет пара недель, так как вчера я отправил ggpmisc 0.2.8 в CRAN, и сегодня утром он был принят. У меня есть опыт работы с LaTeX, поэтому это легко выполнимо. - person Pedro Aphalo; 22.05.2016
comment
Педро, спасибо за быстрый ответ. Ваша помощь очень ценится. Заботиться. Решение в его нынешнем виде должно позволить @MYaseen208 тем временем продолжить работу. - person Technophobe01; 22.05.2016