拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何使用R中的最大似然模型将非线性函式拟合到ggplot2中的资料?

如何使用R中的最大似然模型将非线性函式拟合到ggplot2中的资料?

白鹭 - 2022-01-23 2148 0 0

资料集 (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")

如何使用 R 中的最大似然模型将非线性函式拟合到 ggplot2 中的资料?

uj5u.com热心网友回复:

一些东西:

  • 无论资料集中的名称是什么,您都需要使用yx作为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)

如何使用 R 中的最大似然模型将非线性函式拟合到 ggplot2 中的资料?

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *