r语言如何添加正态曲线 R语言正态分布和S形曲线
昨天硬生生把自己写懵了,结果连睡觉都还在绕这件事,到最后琢磨出来的结果是,我果然很乱来
当咱用线性回归做出来一列残差的时候,如果残差符合正态分布,表示符合随机性,但如果不太符合,那就说明线性回归没能找出数据里所有重要的影响因素
我昨天通过把残差排序后找出了一条接近S形的曲线,但是减掉这条S形曲线后,剩下的部分仍然不符合随机性,后来把数据还原到原来的顺序我才发觉,自己减掉的这条S形曲线才是将近符合正态分布的随机残差
具体再复现一下
先读取数据,由于算来算去发现有些个特别大或特别小的异常值怎么都放不进整个分布,所以本人非常任性的决定,今天一开始做的时候就先刨了它们
T1 <- Table[Table$Deviation >-100 & Table$Deviation <100,]
第一次线性回归的结果依然是残差近乎完美的贴合了源数据,表示线性回归对它真的没啥用处(呵呵呵)
由于整体的微弱倾斜和偏移对整个数据也没有太大影响,所以本人再度任性的决定——要做,就得抓大放小,既然整个数列的随机性是占影响比例最大的,那我干脆就反着来,不管里面的规律性如何,先刨出一个接近正态分布的数列,再看看剩下的货色能不能玩出点啥来,这也算是种思路嘛~~
GD1 <- pnorm(c(-228:229),mean = 0,sd =100)
GD <- sort(T1$Deviation)
plot(GD1, main = "S shape from pnorm")
plot(GD,T1$T, main = "S shape from Deviation-inverse")
本来想直接用R中自带的pnorm函数的,因为画出来也是个翻转的S形,但仔细看看有觉得不行,形状是有一点像,但点分布的密度不一样,咱的数据画出来的反S形点集中在中间,但qnorm画出来的反而是两头的点比较密,所以看来还是要走昨天的路子,用log(p/(1-p))的形式先转换成直线再做
FT <- log(T1$T/(466-T1$T))
T2 <- data.frame("Order"=order(T1$Deviation),GD,FT)
coef(lm(GD~FT,T2))
CanCha2 <- resid(lm(GD~FT,T2))
CanCha1 <- GD - CanCha2
把顺序整理回去,组成一个新的表
T2 <- cbind(T2,CanCha1, CanCha2)
T3 <- T2[order(T2$Order)]
summary(T3)
虽然减掉第一部分后,剩下的数值在源数据中占比已经挺小的了,但还是再研究下
plot(sort(T3$CanCha2))
哎~~~~好像还是个有点接近S形的线,虽然中间已经直了一点,但总体的样子还是那么蛋疼
我今个儿算是跟它杠上了,再来一遍吧
T4 <- data.frame("O2" = order(T3$CanCha2),FT,"GD2" = sort(T3$CanCha2))
cor(T4$FT,T4$GD2)
CanCha3 <- resid(lm(GD2~FT,T4))
summary(CanCha3)
CanCha3画出来的图已经接近平躺了,但两头还是有明显的异常值,所以放大看下细节
plot(sort(CanCha3))
plot(sort(CanCha3[CanCha3 > -0.5 & CanCha3<0.5]))
如果不管两端的异常直接用直线拟合的话,估计也不会偏差太远了
T5 <- data.frame("O3" = T4$O2[order(CanCha3)],FT1 = c(1:458),"C3" = sort(CanCha3))
T6 <- T5[T5$C3 > -0.5 & T5$C3<0.5,]
cor(T6$FT1,T6$C3)
coef(lm(C3~FT1,T6))
最后整理下思绪,如果说所有的随机性都是我们不能成功识别出来的影响因素,那么现在,这个数据其实被拆分成了以下形式:
目标列Deviation =未知因素1 未知因素2 系数3*未知因素3 常数 少量异常
其中,未知因素1和2的分布情况都是均值在0附近的正态分布
所以,我不管啦,还是随机好了
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com