2

我有一个点列表

   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 所示的其他重要部分。

我会很感激任何新的想法。

4

1 回答 1

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")
}

在此处输入图像描述

于 2013-04-14T21:58:22.457 回答