如何用R语言对一组样本数据进行拟合求出密度函数?

Python013

如何用R语言对一组样本数据进行拟合求出密度函数?,第1张

曲线拟合:(线性回归方法:lm)

1、x排序

2、求线性回归方程并赋予一个新变量

z=lm(y~x+I(x^2)+...)

3、plot(x,y)#做y对x的散点图

4、lines(x,fitted(z))#添加拟合值对x的散点图并连线

曲线拟合:(nls)

lm是将曲线直线化再做回归,nls是直接拟合曲线。

需要三个条件:曲线方程、数据位置、系数的估计值。

如果曲线方程比较复杂,可以先命名一个自定义函数。

例:

f=function(x1, x2, a, b) {a+x1+x2^b}

result=nls(x$y~f(x$x1, x$x2, a, b), data=x, start=list(a=1, b=2))

#x可以是数据框或列表,但不能是矩阵

#对系数的估计要尽量接近真实值,如果相差太远会报错:“奇异梯度”

summary(result) #结果包含对系数的估计和p值

根据估计的系数直接在散点图上使用lines加曲线即可。

曲线拟合:(局部回归)

lowess(x, y=NULL, f = 2/3, iter = 3)

#可以只包含x,也可使用x、y两个变量

#f为窗宽参数,越大越平滑

#iter为迭代次数,越大计算越慢

loess(y~x, data, span=0.75, degree=2)

#data为包含x、y的数据集;span为窗宽参数

#degree默认为二次回归

#该方法计算1000个数据点约占10M内存

举例:

x=seq(0, 10, 0.1)y=sin(x)+rnorm(101)#x的值必须排序

plot(x,y) #做散点图

lines(lowess(x,y)) #利用lowess做回归曲线

lines(x,predict(loess(y~x))) #利用loess做回归曲线,predict是取回归预测值

z=loess(y~x)lines(x, z$fit) #利用loess做回归曲线的另一种做法

用plot可以实现散点作图的 只是需要修改参数而已 plot(x,y,'选项')这是plot的基本用法 相信x,y的意思你已经知道了吧 下面是选项的参数: 'r' 红色 'm' 粉红 'g' 绿色 'c' 青色 32 'b' 兰色 'w' 白色 'y' 黄色 'k' 黑色 各种线型属性选项 选 项 意 义 选 项 意 义 '-' 实线 '--' 虚线 ':' 点线 '-.' 点划线 各种标记点属性选项 选 项 意 义 选 项意 义 '.' 用点号绘制各数据点 '^' 用上三角绘制各数据点 '+' 用'+'号绘制各数据点 'v' 用下三角绘制各数据点 '*' 用'*'号绘制各数据点 '>' 用右三角绘制各数据点 ' .' 用'.'号绘制各数据点 '<' 用左三角绘制各数据点 's'或squar 用正方形绘制各数据点'p' 用五角星绘制各数据点 'd'或diamond用菱形绘制各数据点 'h' 用六角星绘制各数据点如plot(x,y,'+') 则作出的图是在每个点处画个‘+’号,然后对你的16个图分别设置16个不同的选项就可以了(组合一下,就会有16个选项了)

局部多项式回归拟合是对两维散点图进行平滑的常用方法,它结合了传统线性回归的简洁性和非线性回归的灵活性。当要估计某个响应变量值时,先从其预测变量附近取一个数据子集,然后对该子集进行线性回归或二次回归,回归时采用加权最小二乘法,即越靠近估计点的值其权重越大,最后利用得到的局部回归模型来估计响应变量的值。用这种方法进行逐点运算得到整条拟合曲线。 

在R语言中进行局部多项式回归拟合是利用loess函数,我们以cars数据集做为例子来看下使用方法。该数据中speed表示行驶速度,dist表示刹车距离。用loess来建立模型时重要的两个参数是span和degree,span表示数据子集的获取范围,取值越大则数据子集越多,曲线越为平滑。degree表示局部回归中的阶数,1表示线性回归,2表示二次回归,也可以取0,此时曲线退化为简单移动平均线。这里我们设span取0.4和0.8,从下图可见取值0.8的蓝色线条较为平滑。 

------------------------

plot(cars,pch=19)

model1=loess(dist~speed,data=cars,span=0.4)

lines(cars$speed,model1$fit,col='red',lty=2,lwd=2)

model2=loess(dist~speed,data=cars,span=0.8)

lines(cars$speed,model2$fit,col='blue',lty=2,lwd=2)

------------------------

当模型建立后,也可以类似线性回归那样进行预测和残差分析 

------------------------

x=5:25

predict(model2,data.frame(speed=x))

plot(model2$resid~model2$fit)

------------------------

R语言中另一个类似的函数是lowess,它在绘图上比较方便,但在功能上不如loess强大和灵活。 

------------------------ 

plot(cars,pch=19) 

lines(lowess(cars),lty=2,lwd=2) 

------------------------ 

LOESS的优势是并不需要确定具体的函数形式,而是让数据自己来说话,其缺点在于需要大量的数据和运算能力。LOESS作为一种平滑技术,其目的是为了探寻响应变量和预测变量之间的关系,所以LOESS更被看作一种数据探索方法,而不是作为最终的结论。