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

Python012

在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和typeof可以归为一个类别,class是另外一个类别。mode和typeof描述的是数据在内存中的存储类型;class描述的是对象的类属性(比如马就是一个类,红马或者白马就是子类,张三的白马和李四的红马就是对象,马这个类有什么属性就是类属性,就像颜色,体重等等)

因为历史的原因(更新过好多次,前身是S语言),所以R语言中数据对象的存储类型变化过好多次。mode和storage.mode得到的是一种比较古老的类型,来自于S语言,其中storage.mode比mode要更精确

mode(3L) # numeric

storage.mode(3L) # integer

typeof 是一种最新的查看类型的函数,针对于R语言而非S语言,而且更为精确,更为细致

storage.mode(`identical`) # function

storage.mode(`if`) # function

typeof(`identical`) # closure

typeof(`if`) # special

class和oldClass返回对象的类属性。对于指定类属性的数据对象,class和oldClass的结果是一样的

a=data.frame(1:10)

oldClass(a) # "data.frame"

class(a) # "data.frame"

但是如果没有指定数据对象的类属性,那么oldClass返回NULL,而class会根据数据对象的存储类型(type)与维度属性来自动给出一个类属性

oldClass(3L) # NULL

class(3L) # integer

class(structure(3L, dim=1)) # array

class(structure(3L, dim=c(1,1))) # matrix

如果用build-in function里的plot,没有完全一致的subplot函数做对应,但是思路跟matlab是一样的:就是将画布分为你需要subplot的数量,举例如下:

attach(iris)

par(mfrow=c(1,2)) #将画布分为一行两列

plot(iris$Sepal.Length,iris$Sepal.Width)

plot(iris$Petal.Length, iris$Petal.Width)

结果如下:

望采纳,谢谢!