Как добавить линию регрессии с линейными и квадратичными компонентами в ggplot? - PullRequest
0 голосов
/ 07 декабря 2018

Так что это довольно сложный вопрос, и я понятия не имею, в чем заключается моя проблема.Я должен создать диаграмму рассеяния, используя ggplot, и «добавить линию, наиболее подходящую для диаграммы рассеяния, которая имеет как линейный, так и квадратичный компонент».Это кажется мне невозможным, и когда я спросил своего профессора, он просто сказал мне заглянуть в наши записи.Мое лучшее предположение - соответствовать линии регрессии ГЛМ.Поэтому я использовал точный код из наших заметок для добавления строки восстановления glm: + geom_smooth(method="glm", method.args=list(family=Gamma(link="log")))

Когда я запускаю ggplot со строкой, ошибки не возникает, но линия не отображается на графике.

ggplot(data=glm_dataframe, mapping=aes(x=log_time, y=slope_mass_vector)) + 
geom_point() + 
xlab("Log Time Interval") + 
ylab("Mass Slope") + 
ggtitle("Mass")+ 
geom_smooth(method="glm", 
 method.args=list(family=Gamma(link="log")))

К вашему сведению, до этого мы создали цикл for для запуска нескольких GLM и возврата значений во фрейме данных.После долгих исследований я подумал, что, возможно, проблема в том, что значения не были числовыми, потому что это была проблема других людей.Поэтому я преобразовал все значения внутри цикла for в числовые, но это не помогло решить мою проблему.Вот код для фрейма данных и цикла for на случай, если это является причиной проблемы:

#create empty vectors for the for loop outputs
    time_interval_vector <- character()
    intercept_vector <- character()
    slope_mass_vector <- character()
    slope_NDVI_vector <- character()
    slope_HFI_vector <- character()
    p_value_intercept_vector <- character()
    p_value_NDVI_vector <- character()
    p_value_HFI_vector <- character()
    p_value_mass_vector <- character()
    R2_vector <- character()

    #create a for loop
    for(i in unique(displace$Time_Interval))
      {
      #create a glm
      displace_glm <- glm(Displacement~NDVI + HFI + Mass, data=displace[displace$Time_Interval==i,], family=Gamma(link="log"))

      #pull out the desired values from the summary
      intercept <- as.numeric(as.character(coef(summary(displace_glm))))[1]
      slope_NDVI <- as.numeric(as.character(coef(summary(displace_glm))))[2]
      slope_HFI <- as.numeric(as.character(coef(summary(displace_glm))))[3]
      slope_mass <- as.numeric(as.character(coef(summary(displace_glm))))[4]
      p_value_intercept <- as.numeric(as.character(coef(summary(displace_glm))))[13]
      p_value_NDVI <- as.numeric(as.character(coef(summary(displace_glm))))[14]
      p_value_HFI <- as.numeric(as.character(coef(summary(displace_glm))))[15]
      p_value_mass <- as.numeric(as.character(coef(summary(displace_glm))))[16]
      R2 <- NagelkerkeR2(displace_glm)[[2]]

      #add the values to the empty vectors
      time_interval_vector <- c(time_interval_vector, i)
      intercept_vector <- c(intercept_vector, intercept)
      slope_mass_vector <- c(slope_mass_vector, slope_mass)
      slope_NDVI_vector <- c(slope_NDVI_vector, slope_NDVI)
      slope_HFI_vector <- c(slope_HFI_vector, slope_HFI)
      R2_vector <- c(R2_vector, R2)
      p_value_intercept_vector <- c(p_value_intercept_vector, p_value_intercept)
      p_value_NDVI_vector <- c(p_value_NDVI_vector, p_value_NDVI)
      p_value_HFI_vector <- c(p_value_HFI_vector, p_value_HFI)
      p_value_mass_vector <- c(p_value_mass_vector, p_value_mass)
      }
    #combine the vectors into a data frame    
    glm_dataframe <- data.frame(time_interval_vector, intercept_vector, slope_mass_vector, slope_NDVI_vector, slope_HFI_vector, R2_vector, p_value_intercept_vector,p_value_NDVI_vector, p_value_HFI_vector, p_value_mass_vector)

1 Ответ

0 голосов
/ 07 декабря 2018

Насколько я понимаю, вы пытаетесь приспособить glm посредством гамма-распределения со ссылкой на журнал.

stat_smooth(aes(y=<your y value>), method = "lm", formula = y ~ x + I(x^2))

Вот пример с данными mtcars

ggplot(mtcars, aes(x=hp, y=mpg))+
  geom_point() +
  stat_smooth(aes(y=mpg), method = "lm", formula = y ~ x + I(x^2))  

enter image description here

...