[英]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
配置的线性组合,而不是单个最佳匹配组合。 因此,该名称中的术语线性 。
我认为你有一些保证该times
值DF
将匹配times
值DF2
。 第一步可能是将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.