在R语言中,逆变换法和伪随机数是否有明显差别呢?

Python016

在R语言中,逆变换法和伪随机数是否有明显差别呢?,第1张

R里的伪随机数怎么取的不得而知,但逆变换法应该是在分布函数已知的情况下最方便的做法吧。

我们从最简单的指数分布来测试吧。方法1用逆变换,方法2用伪随机也就是R里的built-in.

最后比较每种方法和各自,还有和对方的最大绝对值差值的分布。

方法1:

invF <- function(x){ log(1/(1-x))}

D <- vector()

for (i in 1:100){

    a <- runif(1e4) # 两组1万个0-1均匀分布随机数

    b <- runif(1e4)

    ran1 <- sapply(a, invF)

    ran2 <- sapply(b, invF)

    D <- c(D, max(abs(ran1 - ran2)))

}

summary(D)

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

7.651   9.100   9.762   9.875  10.540  13.940

方法2:

D <- vector()

for (i in 1:100){

    a <- rexp(1e4, rate = 1) # 两组1万个参数为1的指数分布随机数

    b <- rexp(1e4, rate = 1)

    D <- c(D, max(abs(a - b)))

}

summary(D)

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

7.765   8.977   9.574   9.727  10.590  12.540

两种方法混合:a是逆变换,b是伪随机

invF <- function(x){ log(1/(1-x))}

D <- vector()

for (i in 1:100){

    a <- runif(1e4)          # 1万个0-1均匀分布随机数

    b <- rexp(1e4, rate = 1) # 1万个参数为1的指数分布随机数

    ran1 <- sapply(a, invF)

    D <- c(D, max(abs(ran1 - b)))

}

summary(D)

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

7.679   8.701   9.385   9.536  10.150  13.610

有没有发现。。根本没什么不同。

mode storage.mode typeof 是一类,检查变量类型,如list integer character等

关系是,从前往后,检查精度越来越细。所以当想看粗类别时,就用mode,看细类别用typeof.

# 此时后两者都能查到最细的程度

mode(1:5) # numeric

storage.mode(1:5) # integer

typeof(1:5) # integer

# 此时只有typeof能查到最细的程度

mode(`+`) # function

storage.mode(`+`) # function

typeof(`+`) # builtin

# 这里稍微解释一下,`+`是一个函数

# 下面两个例子等价

1+2 # 3

`+`(1,2) # 3

class和另外三个不是一个体系

对于有”class”属性的变量,返回的就是这个属性对应的值

对于没有”class”属性的变量,则根据它的类型、维度来确定

# 有"class"属性,只认属性

a <- 1:6

df <-data.frame(a,a+1)

class(df) # data.frame

class(df)<- "abc" # 随便定义一个值

class(df) # abc

#没有属性,根据类型和dim属性

ar <- array(1:4)

attributes(ar) # 数组dim为4

mat <- matrix(1:4)

attributes(mat) # 矩阵dim为4 1 两个值

a <- 1:4 # 没有dim

class(a) # integer

aar <- structure(a,dim=4) # 赋予类似array的dim

class(aar) # array

amat <- structure(a,dim=c(4,1)) # 赋予类似matrix的dim

class(amat) # matrix

class(list(1:4)) # list 不一样类型