【问题标题】:Find the Constant Line that Minimizes Sum of Variances in R找到使 R 中的方差和最小化的常数线
【发布时间】:2017-02-24 20:04:41
【问题描述】:

我在 R 中有一个散点图,x 轴为时间,y 轴为成本。我想找到一条恒定线(y =?),它将最小化从所有这些点到恒定线的方差之和。数据不太重要(例如:mtcars 数据),但如果您想引用某些内容,可以使用下面的代码。

#mtcars
plot(mtcars$wt, mtcars$disp)

i=1
j=1

sum_df <- data.frame()

for(i in as.integer(min(mtcars$disp)):as.integer(max(mtcars$disp))){
  sum_var = list()
  for(j in 1:length(mtcars$disp)){
    sum_var[[j]] <- abs(i-mtcars$disp[j])
  }
  sum_var = do.call(rbind, sum_var)
  sum_var <- sum(sum_var[,1])

  new_sum <- rbind(sum_var,sum_df)

  sum_df <- new_sum
}
row.names(sum_df)=as.integer(min(mtcars$disp)):as.integer(max(mtcars$disp))
sum_df$best_line <- ifelse(min(sum_df[,1])==sum_df[,1], "Best Line", "")
colnames(sum_df) <- c("Disp", "Abs Sum of Var")

我知道我可以遍历不同的常数线并找到每个常数的总和,然后决定哪条线最适合。但是,我有很多数据点,并且已经在循环浏览很多图表。除了蛮力方法之外,还有更好的编码方法吗?

【问题讨论】:

  • 你只是想按照 .... lm(mtcars$disp~1) ... 或 ... lm(mtcars$disp~mtcars$wt) 的方式做一些事情跨度>
  • 所以,我正在寻找“最佳”的恒定线。这可能不一定是平均值。因此,我试图找到类似 lm(mtcars$disp~1) 的值,但该值(230.7,也是平均值)并不是使该数据集的方差总和最小化的线。
  • “恒定线”是什么意思?只是一条水平线?那么x 值与结果有什么关系呢?为什么你不认为这是卑鄙的?总和或方差到底是什么意思?这是否仅仅意味着观测值和常数 y 之间的 y 绝对差?你没有平方距离或任何东西(这更常见)?
  • 对不起,我以为我在原始帖子中提供了更多信息。是的,我想要一条像 y=3 这样的水平线。我希望这条线最小化每个观察值与水平线之间的距离,所以 x 值对我来说真的无关紧要。我被要求通过 y 观察值和恒定 y 线之间的绝对差异来做到这一点。这就是为什么我说这不是平均值的原因,否则是的,如果我对距离进行平方,那将是平均值。

标签: r statistics


【解决方案1】:

您对术语差异和行的使用对我来说有点奇怪。也就是说,我认为您要做的是找到 x 的值,使 sum(abs(mtcars$disp-x)) 尽可能小。如果是这种情况,那么您可以尝试以下代码

myFunction <- function(x,a) {
  sum(abs(x-a))
}

optimize(myFunction, interval=c(range(mtcars$disp)) , tol = 1e-6, a=mtcars$disp)

这并没有提供您的代码提供的价值,但我希望这可能只是您正在寻找的行。 (我从here那里得到了一些灵​​感。)

【讨论】:

  • 是的,我正在寻找这样的东西,所以谢谢!我不知道 R 有优化功能。你知道为什么你的代码给出不同的答案吗?它给出了相同的绝对值之和,但选择的线值不同。
  • 虽然我不确定,但我相信原因可能是问题没有唯一的解决方案。
  • 我刚刚意识到我的代码在需要减少时按递增顺序添加数字(因为 R 从 i=71 开始循环遍历它)。答案都是一样的!感谢您的帮助!
猜你喜欢
  • 2016-06-29
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多