Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 绘制威布尔概率图_R_Plot_Statistics_Weibull - Fatal编程技术网

R 绘制威布尔概率图

R 绘制威布尔概率图,r,plot,statistics,weibull,R,Plot,Statistics,Weibull,我想用一系列形状参数θ绘制1000个威布尔样本的似然函数。我使用了标准化的weibull,因此标度λ为1。然而,输出是一条水平直线 n<-1000 lik <- function(theta, x){ K<- length(theta) n<- length(x) out<- rep(0,K) for(k in 1:K){ out[k] <- prod(dweibull(x, shape= theta[k], scale=1))

我想用一系列形状参数θ绘制1000个威布尔样本的似然函数。我使用了标准化的weibull,因此标度λ为1。然而,输出是一条水平直线

n<-1000
lik <- function(theta, x){
  K<- length(theta)
  n<- length(x)
  out<- rep(0,K)
  for(k in 1:K){
    out[k] <- prod(dweibull(x, shape= theta[k], scale=1))   
  }
  return(out)
}
theta<-seq(0.01, 10, by = 0.01)
x <- rweibull(n, shape= 0.5, scale= 1)
plot(theta, lik(theta, x), type="l", lwd=2)
n你所做的事情并没有什么错,但计算机很难计算出许多小数字的乘积,因此最终可能为零(甚至
0.99^1000
=4^-5)。因此,更容易进行
log
变换,然后进行
sum
。(由于对数变换是一个单调递增函数,使得对数似然最大化与似然最大化相同)。因此

prod(dweibull(x, shape= theta[k], scale=1)) 

另一个微小的变化是在合理的
θ范围内绘制可能性,以便
你可以看到曲线

工作代码:

set.seed(1)
n<-1000
lik <- function(theta, x){
  K <- length(theta)
  n <- length(x)
  out <- rep(0,K)
  for(k in 1:K){
    out[k] <- sum(dweibull(x, shape= theta[k], scale=1, log=TRUE))   
  }
  return(out)
}

popTheta = 0.5
theta = seq(0.01, 1.5, by = 0.01)
x = rweibull(n, shape=popTheta, scale= 1)
plot(theta, lik(theta, x), type="l", lwd=2)
abline(v=popTheta)

theta[which.max( lik(theta, x))]
set.seed(1)

绘制对数似然图<代码>总和(dweibull(x,shape=theta[k],scale=1,log=TRUE))
并将θ保持在一个更合理的范围
seq(0.01,1,by=0.01)
@user20650,请作为答案发布?
set.seed(1)
n<-1000
lik <- function(theta, x){
  K <- length(theta)
  n <- length(x)
  out <- rep(0,K)
  for(k in 1:K){
    out[k] <- sum(dweibull(x, shape= theta[k], scale=1, log=TRUE))   
  }
  return(out)
}

popTheta = 0.5
theta = seq(0.01, 1.5, by = 0.01)
x = rweibull(n, shape=popTheta, scale= 1)
plot(theta, lik(theta, x), type="l", lwd=2)
abline(v=popTheta)

theta[which.max( lik(theta, x))]