Процедура Мараскуило в R

Я провожу процедуру мараскуилио, чтобы сравнить различия между пропорциями. Я использую следующий код (скопирован и адаптирован из этого урока:

## Set the proportions of interest.
p = c(0.3481, 0.1730, 0.4788)
N = length(p)
value = critical.range = c()

## Compute critical values.
for (i in 1:(N-1))
{ for (j in (i+1):N)
{
  value = c(value,(abs(p[i]-p[j])))
  critical.range = c(critical.range,
                     sqrt(qchisq(.95,3))*sqrt(p[i]*(1-p[i])/12000 + p[j]*(1-p[j])/12000))
}
}
round(cbind(value,critical.range),3)

Мне нужно, чтобы на выходе были напечатаны также метки категорий (например, какие категории точно сравниваются).

Так что если категории перечислены в отдельном векторе, например categories <- c("cat1", "cat2", cat"3)сравнения cat1-cat2, cat1-cat3, а также cat2-cat3,

Как я могу добавить эти ярлыки к своему выводу?

    value critical.range
[1,] 0.175          0.016
[2,] 0.131          0.018
[3,] 0.306          0.016

3 ответа

Решение

Будьте внимательны к знаменателю при расчете критического диапазона (12000)... который основан на размере выборки для КАЖДОЙ категории - если у вас нет 12000 наблюдений для каждой категории, то это необходимо скорректировать, если у вас гораздо меньше 12000 наблюдений, ваши критические значения, вероятно, намного ниже, чем то, что дала вам эта функция (и, следовательно, у вас должно быть меньше признаков. различий).

Попробуй это:

## Set the proportions of interest.
p = c(0.3481, 0.1730, 0.4788)
N = length(p)
value = critical.range = tag = c()
categories <- c("cat1", "cat2", "cat3")

## Compute critical values.
for (i in 1:(N-1)){ 
    for (j in (i+1):N){

    value <- c(value,(abs(p[i]-p[j])))
    critical.range = c(critical.range,
                       sqrt(qchisq(.95,N-1))*sqrt(p[i]*(1-p[i])/12000 + p[j]*(1-p[j])/12000))
    tag = c(tag, paste(categories[i], categories[j], sep = "-"))

    }
}
df <- as.data.frame(cbind(value,critical.range, tag), stringsAsFactors = F)
df$value <- round(as.numeric(df$value),3)
df$critical.range <- round(as.numeric(df$critical.range),3)

Выход:

 value critical.range       tag
1 0.175          0.016 cat1-cat2
2 0.131          0.018 cat1-cat3
3 0.306          0.016 cat2-cat3

Вот перевод кода R на Python с 4 категориями и разными размерами выборки (n) для каждой категории. Код был любезно переведен с R на Python помощником Bing AI с небольшими исправлениями, внесенными мной.

      import math
import pandas as pd
from scipy.stats import chi2

p = [0.681818182, 0.816513761, 0.65625, 0.518518519]
n = [22, 109, 32, 27]
N = len(p)
value = []
critical_range = []
tag = []
categories = ["cat1", "cat2", "cat3", "cat4"]
critical_value = chi2.ppf(0.95, 4)

for i in range(N-1):
    for j in range(i+1, N):
        value.append(abs(p[i] - p[j]))
        critical_range.append(math.sqrt(critical_value) * math.sqrt((p[i] * 
                (1 - p[i]) / n[i]) + (p[j] * (1 - p[j]) / n[j])))
        tag.append(categories[i] + "-" + categories[j])

df = pd.DataFrame({"value": value, "critical.range": critical_range, "tag": tag})
df["value"] = df["value"].round(3)
df["critical.range"] = df["critical.range"].round(3)
df["significance"] = df.apply(lambda row: "yes" if row["value"] > 
row["critical.range"] else "no", axis=1)
print(df)

python scipy.stats Bing AI

Другие вопросы по тегам