ks.test с усеченным слева Weibull

Распределение, которому я следую, является усеченным слева распределением Weibull. Я знаю параметры a, форму и масштаб этого распределения для использования команды ptrunc:

require(truncdist);

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

поэтому я хочу, чтобы команда ks.test (см. ниже) использовала описанное усеченное слева распределение Weibull вместо «нормального Weibull».

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; 

Итак, я знаю, что в этом случае нет необходимости выполнять усечение слева. Но в других будет.

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

но

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

дает неверный результат.


person paule    schedule 07.01.2016    source источник
comment
Не могли бы вы привести пример для myvalues?   -  person mra68    schedule 07.01.2016
comment
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); а ‹-7; масштаб‹ -36,37516; форма ‹-9,437013; поэтому я знаю, что в этом случае нет необходимости делать левое усечение. но в других это так!   -  person paule    schedule 07.01.2016
comment
@paule: вы не должны использовать комментарии для уточнения содержания, которое должно быть в теле вопроса. Вы также должны использовать свой ключ с заглавными буквами. Ожидать, что мы разберемся с вашей неряшливостью, просто несправедливо.   -  person IRTFM    schedule 07.01.2016
comment
Ожидать, что мы разберемся с вашими повсеместными и ненужными оскорблениями, еще хуже. В вашем первом предложении сказано все, что нужно сказать.   -  person one_observation    schedule 09.01.2016


Ответы (2)


Прежде всего, ptrunc следует заменить на rtrunc. ptrunc дает вектор значений вероятности. Но в документации ks.test нам нужен образец, и это то, что нам дает rtrunc. Если аргумент a из rtrunc установлен в -Inf, усечения нет, и результат с a=-Inf действительно такой же, как с 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

Но все же результат ks.test( myvalues, "pweibull",scale=scale,shape=shape ) другой:

> ks0

    One-sample Kolmogorov-Smirnov test

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

Причина в том, что myvalues слишком мало. Если мы увеличим его при вызове rtrunc (не ks.test), ks0, ks1 и ks2 будут почти одинаковыми:

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

Теперь посмотрим, что произойдет, когда мы сделаем усечение распределения:

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
person mra68    schedule 07.01.2016

Вы неправильно используете функцию ptrunc (я полагаю), ей нужно ввести последовательность квантилей. Ниже я вычисляю среднее и стандартное отклонение Вейбулла на основе ваших параметров масштаба и формы, затем делаю выборку из 5 стандартных отклонений выше и ниже, чтобы создать набор для сравнения.

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)

введите описание изображения здесь

# 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
person mlegge    schedule 07.01.2016