如何使置信区间适合R中的自定义函数?

如何使置信区间适合R中的自定义函数?,r,confidence-interval,R,Confidence Interval,我刚刚开始研究R,正在努力为我定义的函数添加置信区间。我已经看过很多线性模型的例子,我知道ggplot2可以为一些函数实现这一点。然而,将标注栏与我的自定义函数相匹配是一件棘手的事情。下面是我的数据和我的功能: data<-matrix(c(0.08, 0.1, 0.12, 0.13, 0.49, 0.11, 0.12, 0.15, 0.22, 0.47, 7, 8 , 9, 21, 30, 3, 8, 13, 15, 17),ncol=2) mycurve<-function(x)

我刚刚开始研究R,正在努力为我定义的函数添加置信区间。我已经看过很多线性模型的例子,我知道ggplot2可以为一些函数实现这一点。然而,将标注栏与我的自定义函数相匹配是一件棘手的事情。下面是我的数据和我的功能:

data<-matrix(c(0.08, 0.1, 0.12, 0.13, 0.49, 0.11, 0.12, 0.15, 0.22, 0.47, 7, 8 , 9, 21, 30, 3, 8, 13, 15, 17),ncol=2)
mycurve<-function(x){a+(b*log(x))}
plot(data)
curve(mycurve,add=T)
编辑2:我尝试了@Ben Bolker和@Marcin Kosinski的建议,使用geom_平滑,并将其与我的自定义曲线一起绘制:


数据您是否看到geom_平滑

data<-matrix(c(0.08, 0.1, 0.12, 0.13, 0.49, 0.11, 0.12, 0.15, 0.22, 0.47, 7, 8 , 9, 21, 30, 3, 8, 13, 15, 17),ncol=2)
library(ggplot2)
qplot(data[,1], data[,2])+geom_smooth()

data你还没有提到a和b来自哪里。目前还不清楚你是否在做任何有意义的统计数据。如果a和b是固定/已知常数,则不需要置信带,或者置信带的宽度为0,并且与预测线相同


如果a和b是某些参数的估计值,则可能存在置信区间,但正确的值取决于a和b的计算方式。

这似乎更像是一个统计问题:“如何定义自定义函数的置信区间?”如果有置信区间,
geom_ribbon
确实是一个很好的方法,但你的问题似乎在于置信区间应该是什么。在这种特殊情况下,我只需拟合一个线性模型
lm(y~log(x))
,然后根据模型拟合进行模拟,
arm::sim
使这变得既好又容易。@Gregor,完全同意你的第一个评论。至于你的第二个问题,
geom_smooth(method=“lm”,formula=y~1+log(x))
应该可以解决。@Gregor:我会按照你的建议,从统计学的角度解决第一个问题。感谢您的评论。@DirkSnyman置信区间是拟合过程的结果(您可以得到系数估计值周围的标准误差以及它们之间的相关性,并基于这些误差可以生成置信区间)。因为您似乎已经有了系数估计,所以生成置信区间(通过我能想到的任何方法)需要估计参数中的不确定性。是的,但geom_smooth使用标准函数(lm、glm、gam、黄土、rlm)。如果运行我的代码,您将看到曲线的形状必须是什么样子。如果有一种方法可以使用我自己的函数,我还没有弄明白,希望得到任何指导。去看看@Ben Bolker对grom_smooth的评论。关于你的问题,我在TableCurve软件中拟合了原始曲线。因此,
a
b
是该过程的估计参数。我对这两个都有误差估计。对于
a
它是5,对于
b
它是2。@DirkSnyman,TableCurve用什么方法找到a和b?如果它是普通最小二乘法,那么曲线将匹配geom_平滑结果,因此肯定会有更多的事情发生。它确实是最小二乘法。TableCurve给出的方程式为y=a+blnx,其中a=31.02(s.e.=5.4)和b=9.9(s.e.=2.8)。因此,我使用上述公式和参数值在R中绘制图表。@DirkSnyman,那么要么TableCurve做错了什么,要么ggplot做错了什么,要么仍然有不同之处(可能TableCurve适合非线性最小二乘模型)。事实上,我认为发生的事情是你太舍入了。我在R中拟合模型,系数四舍五入到你的值,但如果我在顶部运行你的代码,将a和b设置为计算值(无四舍五入),那么红色和蓝色线基本相同,因此你可以使用
geom_平滑
方法。你是对的。这是一个取整问题。我设法使这些图适用于
y=a+b*ln(x)
y=a+be^-x
。但是,当我使用其他函数时,例如
y=a+b*ln(x)/x
,我似乎无法正确使用它。我不知道如何处理
y=a*sin(2*pi*x/c+b)
y=a*exp((x-b+c-c*d*exp((x-c*ln(d)-b)/c))/(cd))
。谢谢你迄今为止的大力帮助!
data<-matrix(c(0.08, 0.1, 0.12, 0.13, 0.49, 0.11, 0.12, 0.15, 0.22, 0.47, 7, 8 , 9, 21, 30, 3, 8, 13, 15, 17),ncol=2)
library(ggplot2)
qplot(data[,1], data[,2])+geom_smooth()