Monte Carlo 使用 R 进行模拟:排序和重要性问题
Monte Carlo Simulation using R: Problem with sorting and significance
我正在尝试使用蒙特卡洛模拟实现以下统计测试。此方法基于以下论文:
https://journals.ametsoc.org/doi/full/10.1175/JCLI4217.1
详情:
上述论文使用Monte Carlo 模拟计算了热带气旋通过频率(非正态分布)1961-1983 和 1984-2000 两个时期的均值差异的显着性。
这应该是双尾测试。
提供了以下步骤:
1). First, 9999 randomly sorted 40-yr time series of the typhoon passage frequency are prepared.
2). Averages of the former 23-yr values (1961-1983) minus those of the latter 17-yr values are calculated.
3). From the rank of the original difference value among 10000 samples, the significance level is estimated.
这是我目前所拥有的
假设我有以下数据集。列表示每年的计数,而行表示经纬度坐标(为简单起见,此处使用数字)。
A<-matrix(floor(runif(100,min=0,max=20)),nrow=5,ncol=40)
colnames(A)<-c("X1961","X1962","X1963","X1964","X1965","X1966","X1967","X1968","X1969","X1970","X1971","X1972","X1973","X1974","X1975","X1976","X1977","X1978","X1979","X1980","X1981","X1982","X1983","X1984","X1985","X1986","X1987","X1988","X1989","X1990","X1991","X1992","X1993","X1994","X1995","X1996","X1997","X1998","X1999","X2000")
set.seed(1)
rand <- sample(nrow(A),9999,replace=TRUE)
A[rand,]
问题(更新)
我对如何在 R 中正确执行此操作感到困惑。我应该对每一行执行蒙特卡洛测试。所以在一行中这样做:
A[rand[1],]
X1961 X1962 X1963 X1964 X1965 X1966 X1967 X1968 X1969 X1970 X1971 X1972
X1973
5 14 11 17 16 17 11 2 8 3 13 10
1
X1974 X1975 X1976 X1977 X1978 X1979 X1980 X1981 X1982 X1983 X1984 X1985
X1986
10 15 5 3 6 15 19 5 14 11 17 16
17
X1987 X1988 X1989 X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998
X1999
11 2 8 3 13 10 1 10 15 5 3 6
15
X2000
19
原文:
A[1,]
X1961 X1962 X1963 X1964 X1965 X1966 X1967 X1968 X1969 X1970 X1971 X1972
X1973
18 1 6 7 3 12 19 0 17 17 0 10
16
X1974 X1975 X1976 X1977 X1978 X1979 X1980 X1981 X1982 X1983 X1984 X1985
X1986
3 4 0 15 8 17 1 18 1 6 7 3
12
X1987 X1988 X1989 X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998
X1999
19 0 17 17 0 10 16 3 4 0 15 8
17
X2000
1
预期输出*
我想在这个测试的原始矩阵中添加一个 pvalue 列。显着性检验应每行进行。当然,这可以通过使用 apply() 函数来实现。
问题
如何实现第三个条件?
另外,顺序对蒙特卡洛测试中的第 1 步有影响吗?
我觉得我误解了第 1 步,我应该为此使用 replicate() 吗?是这样的吗?
rand<-replicate(40,sample(nrow(A),9999,replace=T))
关于如何正确执行此操作的任何建议?
对于这方面的任何帮助,我将不胜感激。
这段代码应该可以解决您的问题。如果你必须为大量数据做这件事,它很容易与包 'foreach' 和 'doParallel' 并行化。此函数获取您的数据并为两个数据块制作 nrep 样本,然后取平均值的差异。以此计算均值差的FDP,然后查看均值数据差的百分位数以获得p值。
my.fun <- function(x,nrep = 1000,breakpoint){
# x is the data
# nrep is the amount of simulations
# breakpoint is where the breakpoint is
set.seed(12345)
a_sim <- vector(mode = 'double', length = nrep)
n <- length(x)
for(i in 1:nrep){
aux1 <- sample(x,size = breakpoint,replace = T)
aux2 <- sample(x,size = n-breakpoint,replace = T)
a_sim[i] <- abs(mean(aux1) - mean(aux2))
}
cum_dist_func <- ecdf(a_sim)
p <- 1-cum_dist_func(abs(mean(x[1:breakpoint])-mean(x[(breakpoint+1):n])))
return(p)
}
pvalue <- apply(X = A,MARGIN = 1,FUN = my.fun,breakpoint = 23 )
A <- cbind(A,pvalue)
我正在尝试使用蒙特卡洛模拟实现以下统计测试。此方法基于以下论文: https://journals.ametsoc.org/doi/full/10.1175/JCLI4217.1
详情:
上述论文使用Monte Carlo 模拟计算了热带气旋通过频率(非正态分布)1961-1983 和 1984-2000 两个时期的均值差异的显着性。
这应该是双尾测试。
提供了以下步骤:
1). First, 9999 randomly sorted 40-yr time series of the typhoon passage frequency are prepared.
2). Averages of the former 23-yr values (1961-1983) minus those of the latter 17-yr values are calculated.
3). From the rank of the original difference value among 10000 samples, the significance level is estimated.
这是我目前所拥有的
假设我有以下数据集。列表示每年的计数,而行表示经纬度坐标(为简单起见,此处使用数字)。
A<-matrix(floor(runif(100,min=0,max=20)),nrow=5,ncol=40)
colnames(A)<-c("X1961","X1962","X1963","X1964","X1965","X1966","X1967","X1968","X1969","X1970","X1971","X1972","X1973","X1974","X1975","X1976","X1977","X1978","X1979","X1980","X1981","X1982","X1983","X1984","X1985","X1986","X1987","X1988","X1989","X1990","X1991","X1992","X1993","X1994","X1995","X1996","X1997","X1998","X1999","X2000")
set.seed(1)
rand <- sample(nrow(A),9999,replace=TRUE)
A[rand,]
问题(更新)
我对如何在 R 中正确执行此操作感到困惑。我应该对每一行执行蒙特卡洛测试。所以在一行中这样做:
A[rand[1],]
X1961 X1962 X1963 X1964 X1965 X1966 X1967 X1968 X1969 X1970 X1971 X1972
X1973
5 14 11 17 16 17 11 2 8 3 13 10
1
X1974 X1975 X1976 X1977 X1978 X1979 X1980 X1981 X1982 X1983 X1984 X1985
X1986
10 15 5 3 6 15 19 5 14 11 17 16
17
X1987 X1988 X1989 X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998
X1999
11 2 8 3 13 10 1 10 15 5 3 6
15
X2000
19
原文:
A[1,]
X1961 X1962 X1963 X1964 X1965 X1966 X1967 X1968 X1969 X1970 X1971 X1972
X1973
18 1 6 7 3 12 19 0 17 17 0 10
16
X1974 X1975 X1976 X1977 X1978 X1979 X1980 X1981 X1982 X1983 X1984 X1985
X1986
3 4 0 15 8 17 1 18 1 6 7 3
12
X1987 X1988 X1989 X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998
X1999
19 0 17 17 0 10 16 3 4 0 15 8
17
X2000
1
预期输出*
我想在这个测试的原始矩阵中添加一个 pvalue 列。显着性检验应每行进行。当然,这可以通过使用 apply() 函数来实现。
问题
如何实现第三个条件? 另外,顺序对蒙特卡洛测试中的第 1 步有影响吗?
我觉得我误解了第 1 步,我应该为此使用 replicate() 吗?是这样的吗?
rand<-replicate(40,sample(nrow(A),9999,replace=T))
关于如何正确执行此操作的任何建议?
对于这方面的任何帮助,我将不胜感激。
这段代码应该可以解决您的问题。如果你必须为大量数据做这件事,它很容易与包 'foreach' 和 'doParallel' 并行化。此函数获取您的数据并为两个数据块制作 nrep 样本,然后取平均值的差异。以此计算均值差的FDP,然后查看均值数据差的百分位数以获得p值。
my.fun <- function(x,nrep = 1000,breakpoint){
# x is the data
# nrep is the amount of simulations
# breakpoint is where the breakpoint is
set.seed(12345)
a_sim <- vector(mode = 'double', length = nrep)
n <- length(x)
for(i in 1:nrep){
aux1 <- sample(x,size = breakpoint,replace = T)
aux2 <- sample(x,size = n-breakpoint,replace = T)
a_sim[i] <- abs(mean(aux1) - mean(aux2))
}
cum_dist_func <- ecdf(a_sim)
p <- 1-cum_dist_func(abs(mean(x[1:breakpoint])-mean(x[(breakpoint+1):n])))
return(p)
}
pvalue <- apply(X = A,MARGIN = 1,FUN = my.fun,breakpoint = 23 )
A <- cbind(A,pvalue)