R: nls не выбирает дополнительные аргументы при использовании в пользовательской функции в geom_smooth

Это вопрос, который относится к моему более раннему вопросу geom_smooth с facet_grid и различными функциями подбора. В этом вопросе я пытался использовать другую подходящую функцию в geom_smooth для каждого фасета в сетке фасетов для ggplot2. Marco Sandri любезно предоставил ответ, который я пытаюсь адаптировать для использования пользовательских формул, а не существующих формул (например, lm, loess). Вот мой код.

# Load library
library(ggplot2)

# Load data
data(mtcars)

# Smoothing function with different behaviour depending on the panel
custom.smooth <- function(formula, data,...){
  smooth.call <- match.call()

  if(as.numeric(unique(data$PANEL)) == 6) {
    # Nonlinear regression
    method.name <- eval(parse(text="nls"))
    # Specify formula
    formula <- as.formula("y ~ a * x^b")
    # Add initial parameters
    smooth.call[["start"]] <- c(a = 10, b = -0.5)
  }else{
    # Linear regression
    method.name <- eval(parse(text="lm"))
  }

  # Add function name
  smooth.call[[1]] <- method.name
  # Perform fit
  eval.parent(smooth.call)
}

# Plot data with custom fitting function
p <- ggplot(mtcars,aes(x = disp, y = mpg)) + geom_point() + facet_grid(gear ~ am)
p <- p + geom_smooth(method = "custom.smooth")
print(p)

В этом коде я определяю функцию custom.smooth это выбирает модель, которая будет соответствовать. В этом примере все модели являются линейными регрессиями, за исключением панели 6, которая является определяемой пользователем функцией y ~ a*x^b, Запуск этого кода дает ошибку:

Предупреждающее сообщение: вычисление не выполнено в stat_smooth(): матрица сингулярного градиента при начальных оценках параметров

Тем не менее, когда я бегу nls на данных в панели 6 с этими начальными параметрами я не получаю такой ошибки (т.е. nls(mpg ~ a * disp^b, mtcars %>% filter(gear == 5, am == 1), start = c(a = 10, b = -0.5))). Это заставляет меня думать, что nls не видит начальные значения, которые я указываю. Я также попытался указать эти параметры в geom_smooth функционировать так:

p <- p + geom_smooth(method = "custom.smooth", method.args = list(start = c(a = 10, b = -0.5)))

но я сталкиваюсь с той же проблемой. Любые идеи, как я могу получить свои начальные значения nls? Или есть другая причина, почему код не работает?

1 ответ

Решение

Вот решение, которое очень выиграло от этого поста. Я не знаю, почему предыдущая версия не работала, но это, кажется, работает нормально.

# Load library
library(ggplot2)

# Load data
data(mtcars)

# Smoothing function with different behaviour depending on the panel
custom.smooth <- function(formula, data,...){
  smooth.call <- match.call()

  if(as.numeric(unique(data$PANEL)) == 6) {
    # Nonlinear regression
    smooth.call[[1]] <- quote(nls)
    # Specify formula
    smooth.call$formula <- as.formula("y ~ a * x ^ b")
    # Add initial parameters
    smooth.call$start <- c(a = 300, b = -0.5)
  }else{
    # Linear regression
    smooth.call[[1]] <- quote(lm)
  }

  # Perform fit
  eval.parent(smooth.call)
}

# Plot data with custom fitting function
p <- ggplot(mtcars,aes(x = disp, y = mpg)) + geom_point() + facet_grid(gear ~ am)
p <- p + geom_smooth(method = "custom.smooth", se = FALSE)
print(p)
Другие вопросы по тегам