Как скорректировать проблему при создании графика в R

#r

Вопрос:

Я не понимаю, почему я не могу сгенерировать свой график для CDE кода, можете ли вы помочь мне решить эту проблему? Посмотрите, что для ABC кода он работает нормально.

Исполняемый код ниже:

 library(dplyr)
library(tidyverse)
library(lubridate)


dmda<-"2021-07-07"

datas <- structure(
  list(Code = c("ABC","ABC","ABC","CDE","CDE","CDE"),
       Days = c(1,2,3,1,2,3),
       Numbers = c(11,17,3,2,2,2)),
     class = "data.frame", row.names = c(NA, -6L))

  
  f1 <- function(dat, code_nm) {
    dat <- subset(dat,  Code == code_nm)
    
    plot(Numbers ~ Days,  xlim= c(0,7), ylim= c(0,30),
         xaxs='i',data = dat,main = paste0(dmda, "-", code_nm))
    
    model <- nls(Numbers ~ b1*Days^2 b2,start = list(b1 = 0,b2 = 0),data = dat, algorithm = "port")
    
    new.data <- data.frame(Days = with(dat, seq(min(Days),max(Days),len = 45)))
    new.data <- rbind(0, new.data)
    lines(new.data$Days,predict(model,newdata = new.data),lwd=2)
    coef<-coef(model)[2]
    points(0, coef, col="red",pch=19,cex = 2,xpd=TRUE)
    text(.99,coef   1,round(coef,1), cex=1.1,pos=4,offset =1,col="black")
  }
  
  f1(datas, "ABC")

  f1(datas, "CDE")
  Error in nls(Numbers ~ b1 * Days^2   b2, start = list(b1 = 0, b2 = 0),  : 
  Convergence failure: singular convergence (7)
 

[1]: https://i.stack.imgur.com/zm1AY.png

Пример

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

Ответ №1:

Все очень просто. Ибо CDE таковы все Numbers 2 . Так что это не работает. Если один из 2 них станет 3, это сработает. Например, используя данные ниже,

   Code Days Numbers
1  ABC    1      11
2  ABC    2      17
3  ABC    3       3
4  CDE    1       2
5  CDE    2       2
6  CDE    3       3
 

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

 f1 <- function(dat, code_nm) {
  dat <- subset(dat,  Code == code_nm)
  
  plot(Numbers ~ Days,  xlim= c(0,7), ylim= c(0,30),
       xaxs='i',data = dat,main = paste0(dmda, "-", code_nm))
  if (var(dat$Numbers)>0){
  
  model <- nls(Numbers ~ b1*Days^2 b2,start = list(b1 = 0,b2 = 0),data = dat, algorithm = "port")
  
  new.data <- data.frame(Days = with(dat, seq(min(Days),max(Days),len = 45)))
  new.data <- rbind(0, new.data)
  lines(new.data$Days,predict(model,newdata = new.data),lwd=2)
  coef<-coef(model)[2]
  points(0, coef, col="red",pch=19,cex = 2,xpd=TRUE)
  text(.99,coef   1,round(coef,1), cex=1.1,pos=4,offset =1,col="black")} else {
    yz <- unique(dat$Numbers)
    lines(c(0,dat$Days), c(yz, dat$Numbers), lwd = 2)
    points(0, yz, col = "red", pch = 19, cex = 2, xpd = TRUE)
    text(.1,yz  .5,round(yz,1), cex=1.1,pos=4,offset =1,col="black")
  }
  
}

f1(datas, "CDE")
 

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

Комментарии:

1. Спасибо за ответ Парк! Однако в данном случае для меня это должна была быть горизонтальная линия до 2, вам не кажется? Потому что я не могу изменить его на 3, так как это номер 2.

2. @JVieira, я сделаю простое исключение. Пожалуйста, подождите секунду.

3. @JVieira Я добавляю код выше.

4. @JVieira Я редактирую свой код, а не изображение. lines(c(0,dat$Days), c(yz, dat$Numbers), lwd = 2) часть изменена.

5. @JVieira if Частично условие var()>0 означает, что не все значения одинаковы, что нет проблем с подгонкой nls . Else дело в том, что var() = 0 это означает, что все значения имеют одинаковые значения. Если вам нужно больше объяснений по этому поводу, пожалуйста, дайте мне знать 😀