计算R中周期(循环)变量的均值和方差
Calculating the mean and variance of a periodic (circular) variable in R
我的数据集中有几个变量代表一周内每天发生的事件。
例如,两行可能如下所示:
t1 = c(NA,12.6,10.7,11.5,12.5,9.5,14.1)
t2 = c(23.7,1.2,NA,22.9,23.2,0.5,0.1)
我想计算这些行的方差。为此,我需要均值,因为这些是周期变量,所以我改编了 this page:
中的代码
#This can all be wrapped in a function like this
circ.mean <- function(m,int,na.rm=T) {
if(na.rm) m <- m[!is.na(m)]
rad.m = m*(360/int)*(pi/180)
mean.cos = mean(cos(rad.m))
mean.sin = mean(sin(rad.m))
x.deg = atan(mean.sin/mean.cos)*(180/pi)
return(x.deg/(360/int))
}
这对 t2
的预期有效:
> circ.mean(t2,24)
[1] -0.06803088
虽然理想的答案是 23.93197
。但是对于 t1
,它给出了错误的答案:
> circ.mean(t1,24)
[1] -0.1810074
而使用正常的 mean
函数给出正确答案:
> mean(t1,na.rm=T)
[1] 11.81667
我的问题是:
1) 这个 "circular mean" 代码是否正确?如果正确,我是否正确使用了它?
2) 我有自己的 circ.var
函数(见下文)来计算周期变量的方差 - 这会为所有可能的输入时序向量产生正确的方差吗?
circ.var <- function(m,int=NULL,na.rm=TRUE) {
if(is.null(int)) stop("Period parameter missing")
if(na.rm) m <- m[!is.na(m)]
if(sum(!is.na(m))==0) return(NA)
n=length(m)
mean.m = circ.mean(m,int)
var.m = 1/(n-1)*sum((((m-mean.m+(int/2))%%int)-(int/2))^2)
return(var.m)
}
任何帮助将不胜感激!感谢您花时间阅读本文!
我删除了我的旧答案,因为我认为我提供的解决方案有误。
我编写了一系列 R 脚本,并在我的 GitHub page 中提供,这些脚本可以计算均值、方差和其他统计数据。
感谢@Gregor 的帮助。
我的数据集中有几个变量代表一周内每天发生的事件。
例如,两行可能如下所示:
t1 = c(NA,12.6,10.7,11.5,12.5,9.5,14.1)
t2 = c(23.7,1.2,NA,22.9,23.2,0.5,0.1)
我想计算这些行的方差。为此,我需要均值,因为这些是周期变量,所以我改编了 this page:
中的代码#This can all be wrapped in a function like this
circ.mean <- function(m,int,na.rm=T) {
if(na.rm) m <- m[!is.na(m)]
rad.m = m*(360/int)*(pi/180)
mean.cos = mean(cos(rad.m))
mean.sin = mean(sin(rad.m))
x.deg = atan(mean.sin/mean.cos)*(180/pi)
return(x.deg/(360/int))
}
这对 t2
的预期有效:
> circ.mean(t2,24)
[1] -0.06803088
虽然理想的答案是 23.93197
。但是对于 t1
,它给出了错误的答案:
> circ.mean(t1,24)
[1] -0.1810074
而使用正常的 mean
函数给出正确答案:
> mean(t1,na.rm=T)
[1] 11.81667
我的问题是:
1) 这个 "circular mean" 代码是否正确?如果正确,我是否正确使用了它?
2) 我有自己的 circ.var
函数(见下文)来计算周期变量的方差 - 这会为所有可能的输入时序向量产生正确的方差吗?
circ.var <- function(m,int=NULL,na.rm=TRUE) {
if(is.null(int)) stop("Period parameter missing")
if(na.rm) m <- m[!is.na(m)]
if(sum(!is.na(m))==0) return(NA)
n=length(m)
mean.m = circ.mean(m,int)
var.m = 1/(n-1)*sum((((m-mean.m+(int/2))%%int)-(int/2))^2)
return(var.m)
}
任何帮助将不胜感激!感谢您花时间阅读本文!
我删除了我的旧答案,因为我认为我提供的解决方案有误。
我编写了一系列 R 脚本,并在我的 GitHub page 中提供,这些脚本可以计算均值、方差和其他统计数据。
感谢@Gregor 的帮助。