2016-01-07 1 views
1

La distribution J'accepte mes valeurs à suivre est une distribution de weibull tronquée à gauche. Je sais que les paramètres a, la forme et l'ampleur de cette distribution pour l'utilisation de la commande ptrunc:ks.test avec weibull tronqué à gauche

require(truncdist); 

ptrunc(x,"weibull",a=a,scale=b,shape=c) 

donc je veux la commande ks.test (voir ci-dessous) d'utiliser la décrit la distribution de Weibull gauche tronquée au lieu de la « weibull normale ".

myvalues<-c(37.5, 35.4, 27.1, 32.9, 35.9, 35.1, 34.1, 32.5, 35.5, 31.5, 38.2, 36.1,,29.9, 30.1, 34.7, 38.7 ,32.3, 38.0, 34.9, 44.2, 35.8, 30.8, 39.3, 26.0, 34.2, 40.0, 36.1 ,41.5 ,32.8, 31.9, 41.3 ,30.5, 39.9, 35.0 ,31.2 ,35.0, 30.3, 29.0, 34.4, 35.7, 34.1, 35.4); 
a<-7; 
scale<-36.37516; 
shape<-9.437013; 

Donc, je sais, dans ce cas, il n'est pas nécessaire de faire la troncature du côté gauche. Mais dans d'autres ce sera le cas.

ks.test(myvalues,"pweibull",scale=b,shape=c) #for normal weibull 

mais

ks.test(myvalues,ptrunc(x,"weibull",a=a,scale=b,shape=c)) # for leftruncated 

donne un résultat erroné.

+0

Pourriez-vous nous donner un exemple pour 'myvalues'? – mra68

+0

myvalues ​​<-c (37,5, 35,4, 27,1, 32,9, 35,9, 35,1, 34,1, 32,5, 35,5, 31,5, 38.2, 36.1, 29.9, 30.1, 34.7, 38.7, 32.3, 38.0, 34.9, 44.2, 35.8, 30.8, 39.3, 26.0, 34.2, 40.0, 36.1, 41.5, 32.8, 31.9, 41.3, 30.5, 39.9, 35.0, 31.2 35,0, 30,3, 29,0, 34,4, 35,7, 34,1, 35,4); a <-7; échelle <-36,37516; forme <-9,437013; donc je sais, que dans ce cas il n'est pas nécessaire de faire la troncation leftside. mais dans d'autres c'est! – paule

+0

@paule: Vous ne devez pas utiliser de commentaires pour clarifier le contenu qui devrait figurer dans le corps de la question. Vous devriez également utiliser votre touche majuscule. Nous attendre à faire face à votre négligence est juste injuste. –

Répondre

2

D'abord, ptrunc devrait être remplacé par rtrunc. ptrunc donne un vecteur de valeurs de probabilité. Mais par le documentation ofks.test nous avons besoin d'un échantillon, et c'est ce que rtrunc nous donne. Si l'argument a de rtrunc est réglé sur -Inf, il n'y a pas troncature et le résultat avec a=-Inf est en effet la même que a=7:

library(truncdist) 

myvalues <- c(37.5, 35.4, 27.1, 32.9, 35.9, 35.1, 34.1, 32.5, 35.5, 31.5, 38.2, 36.1,29.9, 30.1, 34.7, 38.7 ,32.3, 38.0, 34.9, 44.2, 35.8, 30.8, 39.3, 26.0, 34.2, 40.0, 36.1 ,41.5 ,32.8, 31.9, 41.3 ,30.5, 39.9, 35.0 ,31.2 ,35.0, 30.3, 29.0, 34.4, 35.7, 34.1, 35.4) 

a <- 7 
scale<-36.37516 
shape <- 9.437013 

set.seed(1) 
y1 <- rtrunc(myvalues,"weibull",a=-Inf,scale=scale,shape=shape) 

set.seed(1) 
y2 <- rtrunc(myvalues,"weibull",a=a,scale=scale,shape=shape) 

set.seed(1) 
ks0 <- ks.test(myvalues, "pweibull",scale=scale,shape=shape ) 

set.seed(1) 
ks1 <- ks.test(myvalues, y1) 

set.seed(1) 
ks2 <- ks.test(myvalues, y2) 

.

> ks1 

    Two-sample Kolmogorov-Smirnov test 

data: myvalues and y1 
D = 0.21429, p-value = 0.2898 
alternative hypothesis: two-sided 

> ks2 

    Two-sample Kolmogorov-Smirnov test 

data: myvalues and y2 
D = 0.21429, p-value = 0.2898 
alternative hypothesis: two-sided 

Mais encore le résultat de ks.test(myvalues, "pweibull",scale=scale,shape=shape ) est différent:

> ks0 

    One-sample Kolmogorov-Smirnov test 

data: myvalues 
D = 0.15612, p-value = 0.2576 
alternative hypothesis: two-sided 

La raison est que myvalues est trop petit. Si nous faisons plus dans l'appel de rtrunc (non ks.test), ks0, ks1 et ks2 sont presque les mêmes:

library(truncdist) 

myvalues <- c(37.5, 35.4, 27.1, 32.9, 35.9, 35.1, 34.1, 32.5, 35.5, 31.5, 38.2, 36.1,29.9, 30.1, 34.7, 38.7 ,32.3, 38.0, 34.9, 44.2, 35.8, 30.8, 39.3, 26.0, 34.2, 40.0, 36.1 ,41.5 ,32.8, 31.9, 41.3 ,30.5, 39.9, 35.0 ,31.2 ,35.0, 30.3, 29.0, 34.4, 35.7, 34.1, 35.4) 

myManyValues <- c(outer((0:9999)/100000,myvalues,"+")) 

a <- 7 
scale<-36.37516 
shape <- 9.437013 

set.seed(1) 
y1 <- rtrunc(myManyValues,"weibull",a=-Inf,scale=scale,shape=shape) 

set.seed(1) 
y2 <- rtrunc(myManyValues,"weibull",a=a,scale=scale,shape=shape) 

set.seed(1) 
ks0 <- ks.test(myvalues, "pweibull",scale=scale,shape=shape ) 

set.seed(1) 
ks1 <- ks.test(myvalues, y1) 

set.seed(1) 
ks2 <- ks.test(myvalues, y2) 

.

> ks0 

    One-sample Kolmogorov-Smirnov test 

data: myvalues 
D = 0.15612, p-value = 0.2576 
alternative hypothesis: two-sided 

> ks1 

    Two-sample Kolmogorov-Smirnov test 

data: myvalues and y1 
D = 0.15655, p-value = 0.2548 
alternative hypothesis: two-sided 

> ks2 

    Two-sample Kolmogorov-Smirnov test 

data: myvalues and y2 
D = 0.15655, p-value = 0.2548 
alternative hypothesis: two-sided 

Maintenant, nous allons voir ce qui se passe quand nous faisons tronquer la distribution:

library(truncdist) 

myvalues <- c(37.5, 35.4, 27.1, 32.9, 35.9, 35.1, 34.1, 32.5, 35.5, 31.5, 38.2, 36.1,29.9, 30.1, 34.7, 38.7 ,32.3, 38.0, 34.9, 44.2, 35.8, 30.8, 39.3, 26.0, 34.2, 40.0, 36.1 ,41.5 ,32.8, 31.9, 41.3 ,30.5, 39.9, 35.0 ,31.2 ,35.0, 30.3, 29.0, 34.4, 35.7, 34.1, 35.4) 

myManyValues <- c(outer((0:9999)/100000,myvalues,"+")) 

a <- 29 
scale<-36.37516 
shape <- 9.437013 

set.seed(1) 
y1 <- rtrunc(myManyValues,"weibull",a=-Inf,scale=scale,shape=shape) 

set.seed(1) 
y2 <- rtrunc(myManyValues,"weibull",a=a,scale=scale,shape=shape) 

set.seed(1) 
ks0 <- ks.test(myvalues, "pweibull",scale=scale,shape=shape ) 

set.seed(1) 
ks1 <- ks.test(myvalues, y1) 

set.seed(1) 
ks2 <- ks.test(myvalues, y2) 

.

> ks0 

    One-sample Kolmogorov-Smirnov test 

data: myvalues 
D = 0.15612, p-value = 0.2576 
alternative hypothesis: two-sided 

> ks1 

    Two-sample Kolmogorov-Smirnov test 

data: myvalues and y1 
D = 0.15655, p-value = 0.2548 
alternative hypothesis: two-sided 

> ks2 

    Two-sample Kolmogorov-Smirnov test 

data: myvalues and y2 
D = 0.2059, p-value = 0.05683 
alternative hypothesis: two-sided 
0

Vous utilisez incorrectement la fonction ptrunc (je suppose), il faut lui fournir une séquence de quantiles. Ci-dessous, je calcule la moyenne et l'écart-type du Weibull en fonction de vos paramètres d'échelle et de forme, puis échantillonnez à partir de 5 écarts-types au-dessus et au-dessous pour produire un ensemble de comparaison.

require(truncdist); 

myvalues <- c(37.5, 35.4, 27.1, 32.9, 35.9, 35.1, 34.1, 32.5, 35.5, 31.5, 38.2, 36.1,29.9, 30.1, 34.7, 38.7 ,32.3, 38.0, 34.9, 44.2, 35.8, 30.8, 39.3, 26.0, 34.2, 40.0, 36.1 ,41.5 ,32.8, 31.9, 41.3 ,30.5, 39.9, 35.0 ,31.2 ,35.0, 30.3, 29.0, 34.4, 35.7, 34.1, 35.4); 
a <- 7; 
scale <- 36.37516; 
shape <- 9.437013; 

# Calculate standard deviation of the weibull 
weib_mean <- scale * gamma(1 + 1/shape) 
weib_sd <- sqrt((scale^2) * (gamma(1 + 2/shape) - (gamma(1 + 1/shape))^2)) 

# Get a sample 
quant <- seq(weib_mean - 5 * weib_sd, weib_mean + 5 * weib_sd, length.out = 1E5) 
weibull_samp <- ptrunc(quant, "weibull", a = a, scale = scale, shape = shape) 

# Take a look 
plot(weibull_samp ~ quant) 

enter image description here

# Use with test 
> ks.test(sort(myvalues), weibull_samp) 
     Two-sample Kolmogorov-Smirnov test 

data: sort(myvalues) and weibull_samp 
D = 1, p-value < 2.2e-16 
alternative hypothesis: two-sided