繁体   English   中英

线性最小二乘拟合

[英]Linear least squares fitting

东风

 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)。

在此示例中,我希望“ a”,“ b”和“ s”值分别为59、140和1e-4,因为这些“ ex”值(DF)最适合“均值”值(DF2) 。

我希望“ a”,“ b”和“ s”值适合“ ex”(DF)最适合“ mean”(DF2)的那些值

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

我从未使用过线性最小二乘拟合,但是我想尝试做的是可能的。

      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?   

听起来线性模型在这里不是您所需要的。 在最佳情况下,线性模型将为您提供不同a/b/s配置的线性组合,而不是单个最佳匹配组合。 因此,该名称中的术语线性

我认为你有一些保证该timesDF将匹配timesDF2 第一步可能是将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]将提供对应于每个矩阵行的a/b/s
  • cbind可以用来结合这两个
  • matrix(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)),]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM