资料集 (x.test, y.test) 是指数拟合。我正在尝试拟合自定义非线性函式,并附上代码。常规点绘制得很好,但我无法使拟合线起作用。有什么建议?
x.test <- runif(50,2,8)
y.test <- 0.5^(x.test)
df <- data.frame(x.test, y.test)
library(ggpmisc)
my.formula <- y ~ lambda/ (1 aii*x)
ggplot(data = df, aes(x=x.test,y=y.test))
geom_point(shape=21, fill="white", color="red", size=3)
stat_smooth(method="nls",formula = y.test ~ lambda/ (1 aii*x.test), method.args=list(start=c(lambda=1000,aii=-816.39)),se=F,color="red")
geom_smooth(method="lm", formula = my.formula , col = "red") stat_poly_eq(formula = my.formula, aes(label = stringr::str_wrap(paste(..eq.label.., ..rr.label.., sep = "~~~"))), parse = TRUE, size = 2.5, col = "red") stat_function(fun=function (x.test){
y.test ~ lambda/ (1 aii*x.test)}, color = "blue")
uj5u.com热心网友回复:
一些东西:
- 无论资料集中的名称是什么,您都需要使用
y
和x
作为formula
自变量中的变量名称geom_smooth
- 你需要更好的起始值(见下文)
- 您可以使用 GLM 技巧来拟合此模型;并不总是有效(可能在数值上不稳定),但它不需要起始值并且比
nls()
- 我不认为
lm()
并且stat_poly_eq()
将使用非线性公式按预期作业(或者可能根本不会)......
模拟资料
(与您的代码相同,但使用set.seed()
- 在这里可能不重要,但很好的做法)
set.seed(101)
x.test <- runif(50,2,8)
y.test <- 0.5^(x.test)
df <- data.frame(x.test, y.test)
尝试 nls 适合您的起始值
它通常是通过安装任何平滑而言是一个好主意来解决外的ggplot2
,所以你必须减少层次挖掘通过对发现的问题:
nls(y.test ~ lambda/(1 aii*x.test),
start = list(lambda=1000,aii=-816.39),
data = df)
nls(y.test ~ lambda/(1 aii * x.test), start = list(lambda = 1000, : 奇异梯度)中的错误
好的,还是不行。让我们使用glm()
以获得更好的起始值:我们使用反向链接GLM:
1/y = b0 b1*x
y = 1/(b0 b1*x)
= (1/b0)/(1 (b1/b0)*x)
所以:
g1 <- glm(y.test ~ x.test, family = gaussian(link = "inverse"))
s0 <- with(as.list(coef(g1)), list(lambda = 1/`(Intercept)`, aii = x.test/`(Intercept)`))
这给出了 lambda = -0.09,aii = -0.638(通过更多的作业,我们可能还可以通过查看曲线的起点和比例来弄清楚如何观察这些)。
ggplot(data = df, aes(x=x.test,y=y.test))
geom_point(shape=21, fill="white", color="red", size=3)
stat_smooth(method="nls",
formula = y ~ lambda/ (1 aii*x),
method.args=list(start=s0),
se=FALSE,color="red")
stat_smooth(method = "glm",
formula = y ~ x,
method.args = list(gaussian(link = "inverse")),
color = "blue", linetype = 2)
0 评论