我有一个积分列表
n x
7 99.06
12 100.45
25 98.11
42 106.92
75 106.78
94 102.34
128 119.05
145 116.54
149 116.06
167 111.49
173 112.69
195 120.25
201 119.70
217 107.62
233 105.53
239 107.86
257 109.77
287 115.71
这是散点图和我想要实现的目标
我想找到跨越两点的所有直线。 我所拥有的是蓝点 - 我想要找的是红线。
简单的解决方案是在所有组合上运行lm
,并通过调整后的R平方过滤前面的组合。但是,有很多组合,这需要很长时间。我已经尝试通过设置部分之间的角度限制来消除,但它不够重要。另外,当我有一个包含其他重要段的长行时,我遇到了一些问题,如图中的1/2所示。
我会很感激任何新想法。
答案 0 :(得分:1)
我用lm
完成了它,找到所有匹配项只需不到两秒钟。这对你来说太长了吗?如果没有,我就是这样做的。我创建了一个包含数据中所有816个三点组合的向量,并循环遍历它。当r平方高于0.9999时,我绘制了该线。
根据这个标准,我在图表的左侧得到更多的拟合,而右边的一些则不存在。似乎在你的图表中,某些拟合并非最佳。您可能想要检查出来
library(zoo)
data1 <- read.table(text="
2012-01-11 99.06
2012-01-19 100.45
2012-02-07 98.11
2012-03-02 106.92
2012-04-19 106.78
2012-05-16 102.34
2012-07-05 119.05
2012-07-30 116.54
2012-08-03 116.06
2012-08-29 111.49
2012-09-07 112.69
2012-10-09 120.25
2012-10-17 119.70
2012-11-12 107.62
2012-12-05 105.53
2012-12-13 107.86
2013-01-10 109.77
2013-02-25 115.71")
data1 <-zoo(data1[,2],as.Date(data1[,1]))
plot.zoo(data1, type="p", col="blue", pch=16)
my.comb <-combn(data1, 3,simplify = FALSE)
for (i in 1:length(my.comb)){
vect <- my.comb[[i]]
reg <-lm(coredata(vect)~index(vect))
if(summary(reg)$adj.r.squared>0.9999) lines(my.comb[[i]], col="red")
}