0

东风

 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 个值(即,times == c(0,20,40,60,120,180,240,360)。

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

我想要那些“ex”(DF)最适合“mean”(DF2)的值的“a”、“b”和“s”值

因为我想要“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?   
4

1 回答 1

1

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

我认为您可以保证 的times值与 的值DF匹配。第一步可能是变成一个数据框,其中每个组合只有一行,不同的值存储为矩阵的列。然后对于每一行,您需要从值中减去这些值,将这些差异平方,然后将它们相加,以计算该行的单个平方误差。然后只需选择具有最小值的行。timesDF2DFa/b/sexexDF2$mean

上述解决方案非常模糊。有一百万种方法可以实际实现这一点,而不是复制我的解决方案,您最好自己编写它们,以您最了解它们的方式。一些提示如何实现各个步骤:

  • 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)),]
于 2012-09-04T21:27:41.847 回答