Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 线性最小二乘拟合_R_Linear Regression_Least Squares_Lm - Fatal编程技术网

R 线性最小二乘拟合

R 线性最小二乘拟合,r,linear-regression,least-squares,lm,R,Linear Regression,Least Squares,Lm,DF DF2 DF是一个较大数据帧的示例,它实际上有数百个“a”、“b”和“s”值的组合,这些组合会产生不同的“ex”值。我想做的是找到‘a’、‘b’和‘s’的组合,它们的‘ex’值DF在等效‘时间’上最适合‘平均’值DF2。 该拟合将是一次8个值的比较,即时间==c0,20,40,60120180240360 在本例中,我希望“a”、“b”和“s”值为59、140和1e-4,因为这些“ex”值DF最适合“平均”值DF2 我希望‘a’、‘b’和‘s’值代表‘ex’DF最适合‘DF2’的值 因为我

DF

DF2

DF是一个较大数据帧的示例,它实际上有数百个“a”、“b”和“s”值的组合,这些组合会产生不同的“ex”值。我想做的是找到‘a’、‘b’和‘s’的组合,它们的‘ex’值DF在等效‘时间’上最适合‘平均’值DF2。 该拟合将是一次8个值的比较,即时间==c0,20,40,60120180240360

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

我希望‘a’、‘b’和‘s’值代表‘ex’DF最适合‘DF2’的值

因为我想要一个可能的‘a’、‘b’和‘s’值的组合,所以线性最小二乘拟合模型将是最好的。我会一次比较8个值,其中“时间”==0-360。 我不希望“a”、“b”和“s”值对每个时间点都最有效。我想要“a”、“b”和“s”值,其中所有8个“ex”DF最适合所有8个“mean”值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")

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

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

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

matrixDF$ex,byrow=TRUE,ncol=8可以计算矩阵 DF[seqfrom=1,to=nrowDF,by=8,2:4]将提供对应于每个矩阵行的a/b/s值 cbind可用于将这两种方法结合起来 matrixDF2$mean,byrow=TRUE,ncol=8,nrow=nrowDF/8将这些平均值转换为一个矩阵,您可以简单地减去它 **2将使矩阵的所有分量平方 行和将添加矩阵行的元素 which.min将返回最小值的索引 以一种可能的方式将所有内容放在一个表达式中,而不使用中间变量,这不是最可读的解决方案:

      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?   
如果不将矩阵存储为数据帧的一部分,则可能需要对其进行转置以避免那些byrow=TRUE参数,并利用矩阵向量减法中的每列都将重复向量这一事实:

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
         )
),]

您能用dputDF和dputDF2提供数据帧吗?这将使它们更容易复制,我需要通过这项工作,但这是线性最小二乘拟合。不是线性回归我以前在做什么?我的印象是R有一些内置的功能,实际上可以做到这一点?我猜不会,但这看起来不错,我会试试。@LucasPinto:线性最小二乘拟合和线性回归听起来差不多,但这两者都不是。如果你必须选择一个术语,我会说这是离散最小二乘拟合:从一组不同的参数组合中,你选择一个导致最小二乘误差的。我认为正确的术语是最近邻搜索:@flodel,我没有考虑过这些术语,但你是对的,这是最近邻搜索。谢谢你提供这个学期!甚至可能有一些合适的R实现来帮助完成这项任务,但考虑到8维并不是那么多,而且大多数最近邻算法显然都是k-最近邻算法,我想这可能有点过分了。@MvG你知道,我想知道是否有一种方法可以适应个人的“时间”,这段代码适合8个时间点,但这并不是最适合异常值的例子。也许我们可以在聊天室继续讨论?
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
         )
),]
DF[seq(from=1, to=nrow(DF), by=8),2:4][which.min(
  colSums((matrix(DF$ex, nrow=8) - DF2$mean)**2)),]