| “应用统计田恬 统计计算作业一” |
令 \(u=F(x)\),解\(x\)可得
\[ F^{-1}(u)=\frac{b}{(1-u)^{1/a}} =b(1-u)^{-1/a}, \qquad 0≤u<1. \]
当 \(a=2\)、\(b=2\) 时,逆变换函数为
\[ F^{-1}(u)=\frac{2}{\sqrt{1-u}}. \]
set.seed(111)
n <- 1000
a <- 2
b <- 2
u <- runif(n)
x <- b / (1 - u)^(1 / a)
Pareto\((a,b)\) 的密度函数为
\[ f(x)=\frac{ab^a}{x^{a+1}}, \qquad x\ge b. \]
所以 Pareto\((2,2)\) 的密度为 \(f(x)=8/x^3\)(\(x\ge 2\))。
h <- hist(
x,
prob = TRUE,
breaks = "FD",
xlim = c(2, 30),
ylim = c(0, 1.05),
main = bquote(f(x) == a*b^a/x^{a+1})
)
y <- seq(2, 30, 0.01)
lines(y, 8/y^3)
set.seed(222)
n <- 1000
u <- runif(n)
x_inverse <- integer(n)
x_inverse[0.0 <= u & u < 0.1] <- 0
x_inverse[0.1 <= u & u < 0.3] <- 1
x_inverse[0.3 <= u & u < 0.5] <- 2
x_inverse[0.5 <= u & u < 0.7] <- 3
x_inverse[0.7 <= u & u <= 1.0] <- 4
x_value <- 0:4
prob <- c(0.1, 0.2, 0.2, 0.2, 0.3)
x <- sample(
x_value,
size = n,
replace = TRUE,
prob = prob
)
round(rbind(table(x)/n,prob),3)
## 0 1 2 3 4
## 0.099 0.212 0.189 0.184 0.316
## prob 0.100 0.200 0.200 0.200 0.300
Beta(3,2) 的密度函数为 \(12x^2(1-x)\),令 \(g(x)\) 为 U(0,1) 分布的密度函数。这样对于 \(0<x<1\) 都有 \(f(x)/g(x)\le 12\), 因此可以令 \(c=12\)。
n=1000
k=0
j=0
y=numeric(n)
while(k<n){
u=runif(1)
j=j+1
x=runif(1)
if (x^2*(1-x)>u){
k=k+1
y[k]=x
}
}
j
## [1] 11859
hist(
y,
prob = TRUE,
breaks = "FD",
xlim = c(0, 1),
ylim = c(0, 2),
main = bquote(f(x) == 12*x^2*(1-x))
)
x <- seq(0, 1, by = 0.01)
y <- 12*x^2*(1-x)
lines(x, y, lwd = 2)
lognorm<-function(n,mu,sigma2){
u<-runif(n)
z<-qnorm(u)
x<-exp(mu+sqrt(sigma2)*z)
return(x)
}
set.seed(111)
y=lognorm(1000,0,1)
x_right=unname(quantile(y,0.99))
hist(
y,
prob = TRUE,
breaks = "FD",
xlim = c(0, x_right),
ylim = c(0, 0.8)
)
z1=seq(0,x_right,length.out=1000)
z2=dlnorm(z1,0,1)
lines(z1,z2,lwd=2)
loc.mix<-function(n,p,mu1,mu2,sigma2){
n1<-rbinom(1,size=n,prob=p)
n2<-n-n1
x1<-rnorm(n1,mu1,sqrt(sigma2))
x2<-rnorm(n2,mu2,sqrt(sigma2))
X<-c(x1,x2)
return(sample(X))
}
set.seed(111)
x1=loc.mix(1000,.1,0,3,1)
x2=loc.mix(1000,.3,0,3,1)
x3=loc.mix(1000,.5,0,3,1)
x4=loc.mix(1000,.7,0,3,1)
x5=loc.mix(1000,.9,0,3,1)
rmvn.eigen<-function(n,mu,Sigma){
d<-length(mu)
ev<-eigen(Sigma,symmetric=TRUE)
lambda<-ev$values
V<-ev$vectors
R<-V%*%diag(sqrt(lambda)) %*% t(V)
Z<-matrix(rnorm(n*d),nrow=n,ncol=d)
X<-Z%*%R+matrix(mu,n,d,byrow=TRUE)
X
}
rmvn.svd<-function(n,mu,Sigma){
d<-length(mu)
S<-svd(Sigma)
R<-S$u%*%diag(sqrt(S$d)) %*% t(S$v)
Z<-matrix(rnorm(n*d),nrow=n,ncol=d)
X<-Z%*%R+matrix(mu,n,d,byrow=TRUE)
X
}
rmvn.Choleski<-function(n,mu,Sigma){
d<-length(mu)
Q<-chol(Sigma)
Z<-matrix(rnorm(n*d),nrow=n,ncol=d)
X<-Z%*%Q+matrix(mu,n,d,byrow=TRUE)
X
}
set.seed(111)
mu <- c(0, 1, 2)
Sigma <- matrix(
c(1.0, -0.5, 0.5,
-0.5, 1.0, -0.5,
0.5, -0.5, 1.0),
nrow = 3,
ncol = 3,
byrow = TRUE
)
X=rmvn.eigen(200,mu,Sigma)
pairs(X)
Y=rmvn.svd(200,mu,Sigma)
pairs(Y)
Z=rmvn.Choleski(200,mu,Sigma)
pairs(Z)