#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:
Все очень просто. Ибо 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
это означает, что все значения имеют одинаковые значения. Если вам нужно больше объяснений по этому поводу, пожалуйста, дайте мне знать 😀