首页 > 解决方案 > 如何使用 NaN 将单个时间点标准误差列添加到数据框(24 小时时间点的一周平均值的 SE)

问题描述

我需要绘制小鼠体温图。在 7 天的时间里,我每 15 分钟收集一次数据点。我还计算了该图每个时间点的平均温度。下一步是计算每个平均温度的标准误差,同时考虑所有 7 天的温度读数。这是我正在使用的扩展数据的图像:

https://imgur.com/ukk0iOt

我还有一个单独的、浓缩的数据框,它是上面每个时间点 7 天的平均值的 mean_temp,因此在 24 小时的时间点中每个时间点只有一个温度读数。它有 96 行,仅包含 time 和 mean_temp24 列。

使用以下代码,我只能计算所有时间点的单个标准误差(我知道这是错误的,但我很想找到解决方案)。我也无法从浓缩的 24 小时数据集中计算标准误差,因为不存在整整 7 天的温度。

将三只小鼠的平均温度(7 天)列添加到数据框“df”中 df=cbind(df,"mean_temp"=rowMeans(df[,3:5],na.rm=TRUE))

尝试计算每个时间点的标准偏差,首先 times = unique(df$time)

实现每行单个标准误差的功能

for (current_time in times){
df$se=sd(df$mean_temp24, na.rm=T)/sqrt(3-1)
}

理想情况下,我最终会得到一个包含 96 行(每行 15 分钟间隔时间点)的 24 小时温度数据的数据框,其中的值是每个时间点的七个温度的平均值(图像中的“mean_temp”我的数据框)。我还将为标准误差增加一列,其中考虑了用于计算最终 24 小时数据集中平均温度的 7 个温度值。

对于未压缩到 24 小时的完整数据集中的每个时间点,实际输出是单个相同的 SE。

标签: rnan

解决方案


使用 plyr 包中的 ddply。对于 dt 和 time 的每个唯一组合,都会调用函数 f:

f = function(x) {
  n3 = length(which(!is.na(x[,3])))
  n4 = length(which(!is.na(x[,4])))
  n5 = length(which(!is.na(x[,5])))
  data.frame(
    mean3 = mean(x[,3], na.rm=TRUE),
    mean4 = mean(x[,4], na.rm=TRUE),
    mean5 = mean(x[,5], na.rm=TRUE),
    se3 = sd(x[,3], na.rm=TRUE)/sqrt(n3),
    se4 = sd(x[,4], na.rm=TRUE)/sqrt(n4),
    se5 = sd(x[,5], na.rm=TRUE)/sqrt(n5)
  )
}
ddply(df, .(dt,time), f)

推荐阅读