通过散点图拟合Logistic曲线

3
我希望通过散点图数据绘制一个逻辑回归趋势线,但我不知道如何去做。我在网上搜索到一些需要三个参数的函数,但我不知道如何找到这些参数。任何帮助将不胜感激。
数据:
    x          y
1    0 36.4161850
2    0 94.2196532
3    0 94.7976879
4    0 98.2658960
5    0 97.1098266
6  250 40.4624277
7  250 41.0404624
8  250 23.6994220
9  250 48.5549133
10 250 61.2716763
11 500  5.7803468
12 500  3.4682081
13 500  0.5780347
14 500  2.8901734
15 500  0.0000000
16 750  0.0000000
17 750  0.0000000
18 750  0.0000000
19 750  0.0000000
20 750  0.0000000

dummy <- structure(list(x = c("0", "0", "0", "0", "0", "250", "250", "250", 
"250", "250", "500", "500", "500", "500", "500", "750", "750", 
"750", "750", "750"), y = c(36.4161849710983, 94.2196531791908, 
94.7976878612717, 98.2658959537572, 97.1098265895954, 40.4624277456647, 
41.0404624277457, 23.6994219653179, 48.5549132947977, 61.271676300578, 
5.78034682080925, 3.46820809248555, 0.578034682080925, 2.89017341040462, 
0, 0, 0, 0, 0, 0)), reshapeLong = structure(list(varying = structure(list(
    Proportion = c("m0.perc", "m250.perc", "m500.perc", "m750.perc"
    )), .Names = "Proportion", v.names = "Proportion", times = c("m0.perc", 
"m250.perc", "m500.perc", "m750.perc")), v.names = "Proportion", 
    idvar = "id", timevar = "Distance"), .Names = c("varying", 
"v.names", "idvar", "timevar")), .Names = c("x", "y"), row.names = c(NA, 
-20L), class = "data.frame")

我想要的是一条始于高点、终于低点的逻辑曲线,就像散点图中的镜像“S”形。

plot(y~x, data = dummy)

感谢您的帮助。

输入图像描述


(这是一个关于IT技术的图片,无法翻译)

从查看https://en.wikipedia.org/wiki/Logistic_function,似乎这是一个不错的开始。尝试使用函数进行适当参数符号/曲线形状的测试`f = function(L, k, x0, x) L / (1 + exp( -k* (x - x0))) ; plot(f(100, -0.01, 300, 1:600), type="l")(不是非常有结构化的方法!)。尝试拟合minpack.lm::nlsLM(y ~ L / (1 + exp( -k* (x - x0))), start=c(L=100, k=-0.1, x0=300 ), data=dummy)。[记得执行dummy$x <- as.numeric(dummy$x)`,因为当前它是字符] - user2957945
感谢您的回复。然而,您的答案让我感到困惑。第一部分确实绘制了一个图形,但它没有将其叠加在散点图上。您答案的第二部分拟合了一个模型,但并没有拟合任何东西? - FlyingDutch
你写道你想拟合一条曲线,但需要估算参数。上面的注释中提供了非线性模型来进行估算。初始函数 f 和绘图被用于找到 nlsLM 函数的起始参数。为了进行最终绘图,你可以使用模型上的预测,类似于进行线性回归时已经安装的线性回归线。 - user2957945
我明白了,感谢您的解释。这比Gilles的答案多了一点工作,但结果相同。 - FlyingDutch
当然,但(在我看来),值得花费一些努力学习如何更加标准/通用地解决非线性回归问题。 - user2957945
1个回答

4

可能有用的包是 drc(用于剂量响应曲线)。

您可以使用3或4个参数对连续数据进行逻辑回归曲线估计。该函数会自动为优化算法查找良好的起始值(与例如nls相比)。它还具有易于绘图的方法。

这里是带有3个参数的示例(参数为 fct = L.3())。第四个参数是下限渐近线,并且被固定为0。在四个参数模型中,估计下限渐近线。

> dummy$x <- as.numeric(dummy$x)
> 
> library("drc")
> mL <- drm(y ~ x, data = dummy, fct = L.3(), type = "continuous")
> summary(mL)

Model fitted: Logistic (ED50 as parameter) with lower limit fixed at 0 (3 parms)

Parameter estimates:

                Estimate Std. Error    t-value p-value
b:(Intercept)   0.013938   0.010315   1.351208  0.1943
d:(Intercept)  86.789553  10.417186   8.331382  0.0000
e:(Intercept) 248.714704  30.029077   8.282463  0.0000

Residual standard error:

 14.61229 (17 degrees of freedom)

> plot(mL, type = "all")
> 

enter image description here


那看起来是一个简单的解决方案。但是,为什么x轴改变了?它能像原始轴一样可视化,从0到800米运行吗? - FlyingDutch
1
这是因为在生态毒理学中,x轴表示产品的剂量,并且通常用对数刻度表示。因此,x轴的对数刻度是默认设置。使用以下命令将其绘制在原始刻度上:plot(mL, type = "all", log = '') 并查看?plot.drc以获取有关该方法的帮助。 - Gilles San Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接