2012-09-04 94 views
0

DF线性最小二乘法拟合

times a b s ex 
1 0 59 140 1e-4 1 
2 20 59 140 1e-4 0 
3 40 59 140 1e-4 0 
4 60 59 140 1e-4 2 
5 120 59 140 1e-4 20 
6 180 59 140 1e-4 30 
7 240 59 140 1e-4 31 
8 360 59 140 1e-4 37 
9 0 60 140 1e-4 0 
10 20 60 140 1e-4 0 
11 40 60 140 1e-4 0 
12 60 60 140 1e-4 0 
13 120 60 140 1e-4 3300 
14 180 60 140 1e-4 6600 
15 240 60 140 1e-4 7700 
16 360 60 140 1e-4 7700 
# dput(DF) 
structure(list(times = c(0, 20, 40, 60, 120, 180, 240, 360, 0, 
20, 40, 60, 120, 180, 240, 360), a = c(59, 59, 59, 59, 59, 59, 
59, 59, 60, 60, 60, 60, 60, 60, 60, 60), b = c(140, 140, 140, 
140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140 
), s = c(1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 
1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04), ex = c(1, 
0, 0, 2, 20, 30, 31, 37, 0, 0, 0, 0, 3300, 6600, 7700, 7700)), .Names = c("times", 
"a", "b", "s", "ex"), row.names = c(NA, 16L), class = "data.frame") 

DF2

prime times  mean  
g1   0 1.0000000 
g1   20 0.7202642 
g1   40 0.8000305 
g1   60 1.7430986 
g1  120 16.5172242 
g1  180 25.6521268   
g1  240 33.9140056 
g1  360 34.5735984 
#dput(DF2) 
structure(list(times = c(0, 20, 40, 60, 120, 180, 240, 360), 
mean = c(1, 0.7202642, 0.8000305, 1.7430986, 16.5172242, 
25.6521268, 33.9140056, 34.5735984)), .Names = c("times", 
"mean"), row.names = c(NA, -8L), class = "data.frame") 

DF是实际上有几百的 'a' 的组合, 'B' 更大的数据帧的一个例子,和“ s'值导致不同的'ex'值。我想要做的是找到'a','b'和's'的组合,其'ex'值(DF)最好符合'平均值'(DF2)在相同的“时间”。 此拟合将一次比较8个值(即,时间== c(0,20,40,60,120,180,240,360))

在此示例中,我希望59,140和1e-4代表a','b'和's'值,因为那些'ex'值(DF)最适合'平均值'(DF2)。

我想'a','b'和's'值'ex'(DF)最适合'的意思是'(DF2)

因为我想要'a','b'和's'值的一个可能组合,最小二乘拟合模型是最好的,我会一次比较8个值 - 'times'== 0 - 360. 我不想'a','b'和's'值最适合每个时间点。我想要'a','b'和's'值,其中所有8'ex'(DF)最适合所有8个'平均值'(DF2) 这是我需要帮助的地方。

我从来没有使用线性最小二乘法拟合,但我假设我想要做的是可能的。

 lm(DF2$mean ~ DF$ex,....) # i'm not sure if I should combine the two 
     # data frames first then use that as my data argument, then 
     # where I would include 'times' as the point of comparison, 
     # if that would be used in subset? 
+0

你能提供与'dput(DF)'和'dput(DF2)'的数据帧:构造函数将在矩阵向量减法被重复用于每一?这将使他们更容易重现 –

回答

1

这听起来像一个线性模型是不是你需要在这里。最佳情况下,线性模型会给出不同a/b/s配置的线性组合,而不是单个最佳匹配组合。因此,术语线性在那个名字。

我认为您有一定的保证DFtimes值将与DF2的值times相匹配。第一步可能是将DF转换为数据帧,其中每个a/b/s组合只有一行,并且不同的ex值存储为矩阵的列。然后,对于每一行,您希望从DF2$mean值中减去ex值,将这些差值平方并将它们相加,以计算该行的单个平方误差。然后只需选择最小值的行。

上述解决方案非常模糊。实际上有一百万种方法来实现这一点,而不是复制我的解决方案,你最好自己写一下,就像你最好地理解它们一样。一些提示如何实现的各个步骤:

  • matrix(DF$ex, byrow=TRUE, ncol=8)可以计算矩阵
  • DF[seq(from=1, to=nrow(DF), by=8),2:4]将提供对应于每个矩阵的行
  • cbind可用于这两个
  • 结合的a/b/smatrix(DF2$mean, byrow=TRUE, ncol=8, nrow=nrow(DF)/8)将这些手段变成一个矩阵,你可以简单地减去
  • **2将矩阵的所有组成部分
  • rowSums将添加一个矩阵
  • which.min的行的元素将返回最小值

的索引在一种可能的方式将它们组合起来,即把一切在一个单一的表达,而无需使用中间变量(不是最可读的解决方案):

DF[seq(from=1, to=nrow(DF), by=8),2:4][which.min(
    rowSums((matrix(DF$ex, byrow=TRUE, ncol=8) - 
      matrix(DF2$mean, byrow=TRUE, ncol=8, nrow=nrow(DF)/8) 
     )**2 
     ) 
),] 

如果没有存储矩阵作为数据帧的一部分,你可能要调换,以避免那些byrow=TRUE参数和利用的事实已经

DF[seq(from=1, to=nrow(DF), by=8),2:4][which.min(
    colSums((matrix(DF$ex, nrow=8) - DF2$mean)**2)),] 
+0

我需要通过这个工作,但这是线性最小二乘拟合。不是线性回归我之前做的是什么?我的印象是R有一些内置函数可以做到这一点?不要猜测,但这看起来不错,我会试试看。 – Doug

+0

@LucasPinto:线性最小二乘拟合和线性回归听起来差不多,但这两者都不是。如果你必须选择一个术语,我会说这是*离散*最小二乘拟合:从一组不同的参数组合中,选择导致最小平方误差的那个。 – MvG

+0

我认为正确的术语是*最近邻居搜索*:http://en.wikipedia.org/wiki/Nearest_neighbor_search – flodel