【问题标题】:For-loop error and min 2.5% and max 97.5% percentile in RFor-loop 错误和 R 中的最小 2.5% 和最大 97.5% 百分位数
【发布时间】:2012-08-14 13:02:39
【问题描述】:

我有一个包含 41 行和 21 列的数据集。在 DF 中,每一行代表一天中 15 分钟间隔(从上午 10 点到晚上 8 点)的能量数据。每列代表一个月内的选定日期。

我需要使用以下公式计算每列中两行的负载可变性(标准偏差/平均值)。

即在第 1 和第 2 之间; 1、2、3;第 1-4 名;第 1-5 名;等每列的元素。

我不断在“lv”中获得 NA 值,不知道为什么。最终结果,lv 应该有一个 41x21 的数据框,与 df 相同,但具有负载可变性。

此外,除了负载可变性之外,我如何在循环中获得 2.5 和 97.5 个百分位数?

x <- df[1:41,1:21]

#calculate load variability 
count = 0
i=1{
for (i in 1:41){
     count = count+1  
     mean = sum (x[1:l,])/count
     diff = ((x-mean)^2)
     lv= sqrt((diff/(count+1)-1)/mean)
         i = i+1
  }
}
lv

lv 以空值 (NA) 结束。

【问题讨论】:

  • 首先,您在内部重新分配x,这意味着,在您的循环范围内,您将丢失原始数据。
  • 您是要计算每一行的 sd/mean,还是真的要计算循环中前 i 行的所有数据?
  • 我正在尝试对每一行进行 sd/mean。
  • 第一:df 是什么?下一步:您将 x 从 41 x 63 数组减少到 1 x 63 数组,因此下一次通过循环时,您将超过 x 的当前尺寸。您忽略了发布错误消息。
  • 问题仍然不清楚,即使在编辑之后。您参考 beweeen 列的负载可变性。但是,您的公式只是 sd/mean 是对一组数据的度量。您还说您希望结果具有与原始数据相同的维度。那么,您希望第一行中的第一个条目是什么?单个数据点的标准差/平均值,即 0?

标签: r for-loop percentile


【解决方案1】:

如果您想计算每一行的 sd/mean,请尝试:

apply(x, 1, sd)/rowMeans(x)

如果您想要每行的 2.5% 和 97.5% 置信水平,请尝试:

apply(x, 1, quantile, c(.025, 0.975))

【讨论】:

  • 忍者!但是快点:翻转它,使其成为标准/均值 :-)
  • 剪切和粘贴太快了!
  • 谢谢,但是你如何在 for 循环中计算呢?
  • 重点是使用apply 来避免使用循环。但是如果你必须:-),只需修改你的代码:删除 x&lt;-x[1:i.... 行并将计算替换为 mean = sum(x[i,])/count 。另请注意,不建议对变量使用“mean”和“diff”,因为它们是基本 R 包中的函数。
  • 正如 Carl 指出的那样,apply 避免了循环的需要:它只为每一行提供结果。考虑矢量化!
【解决方案2】:

好的,经过几次尝试(以及来自this question的一些帮助),我终于有了:

cumul_loading <- function(x, leave.nan=FALSE){
  ind_na <- !is.na(x)
  nn <- cumsum(ind_na)
  x[!ind_na] <- 0

  cumul_mean <- cumsum(x) / nn
  cumul_sd <- sqrt(cumsum(x^2) / (nn-1) - (cumsum(x))^2/(nn-1)/nn)

  if(leave.nan) return(cumul_sd / cumul_mean) else 
    return((cumul_sd / cumul_mean)[-1])
}

它应该有一些错误(例如如何处理 NA),但它现在应该可以与 apply 函数一起使用。 leave.nan 参数可以选择保留 n_len - 1 = 0 时产生的 NaN

apply(x, 2, cumul_loading)

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 2020-05-28
    • 2022-01-15
    • 2017-12-11
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多