Shapiro.test в R дает "все значения х одинаковы"?

Я работал над получением таблицы p-значений теста гипотезы нормальности Шапиро-Уилкса на моем фрейме данных. Вот кадр данных (с именем "mdf1") в виде CSV, разделенных запятыми.

Тестирование Шапиро-Уилкса в R требует, чтобы размер выборки был больше 3. Чтобы установить подмножество моего фрейма данных (который содержит два соответствующих фактора, "переменная" и "Сайт"), я использовал следующий код:

    Z <- as.data.frame(data.table(mdf1)[, list(freq=.N, value=value), by=list(Site,variable)][freq > 3])

Это привело к тому, что фрейм данных "Z" содержал все значения, которые принадлежали комбинации "Site"*"переменная", где n больше 3. Затем я пытаюсь передать Z в ddply Функция для получения таблицы значений p Shapiro-Wilkes:

    norm2 <- ddply(Z, .(Site, variable), summarize, n=length(value), sw=shapiro.test(value)[2])

Результат этой команды:

Error in shapiro.test(val) : all 'x' values are identical

Как это может быть? Какие-нибудь мысли?

2 ответа

Решение

Ваш value переменная здесь строка Но ??shapiro.test(x) Говорит, что x является числовым вектором значений данных... Пропущенные значения допускаются, но число не пропущенных значений должно быть между 3 и 5000. Первые две строки кода совпадают с моим ответом на ваш предыдущий вопрос.

Таким образом, вы можете использовать следующий код (проверено):

mydata$inter<-with(mydata,interaction(Site,variable))
mydata1<-mydata[mydata$inter %in% names(which(table(mydata$inter) > 3)), ]  
library(plyr) 
ddply(mydata1, .(inter), summarize, n=length(value),sw=shapiro.test(as.numeric(value))[2])

                inter  n        sw
1  41332.Effluent (N) 18 0.6294289
2  41369.Effluent (N) 18 0.6294289
3  41385.Effluent (N) 10  0.969692
4  41394.Effluent (N) 12 0.5272433
5  41402.Effluent (N) 12 0.4404443
6  41436.Effluent (N) 14 0.6283259
7  41439.Effluent (N)  6  0.484449
8  41450.Effluent (N)  5 0.5012284
9  41452.Effluent (N) 14 0.5331113
10 41457.Effluent (N) 12 0.5272433
11 41458.Effluent (N) 12 0.5272433
12 43635.Effluent (N)  7 0.7437188
13 41332.Effluent (S) 13 0.5331956
14 41369.Effluent (S)  7 0.4869206
15 41379.Effluent (S)  6  0.484449
16 41385.Effluent (S)  7 0.4869206
17 41394.Effluent (S) 12 0.5272433
18 41436.Effluent (S) 14 0.6283259
19 41332.Influent (N) 18 0.6294289
20 41369.Influent (N) 18 0.6294289
21 41385.Influent (N) 10  0.969692
22 41394.Influent (N) 12 0.5272433
23 41402.Influent (N) 12 0.4404443
24 41436.Influent (N) 14 0.6283259
25 41439.Influent (N)  6  0.484449
26 41450.Influent (N)  5 0.5012284
27 41452.Influent (N) 14 0.5331113
28 41457.Influent (N) 12 0.5272433
29 41458.Influent (N) 12 0.5272433
30 43635.Influent (N)  7 0.7437188
31 41332.Influent (S) 13 0.5331956
32 41369.Influent (S)  7 0.4869206
33 41379.Influent (S)  6  0.484449
34 41385.Influent (S)  7 0.4869206
35 41394.Influent (S) 12 0.5272433
36 41402.Influent (S) 12 0.4404443
37 41436.Influent (S) 14 0.6283259
38 41452.Influent (S)  7 0.6578695
39 41457.Influent (S)  7 0.6578695
40 41458.Influent (S)  8 0.7159932
41         41332.PLot  6  0.484449
42         41369.PLot  6  0.484449
43         41379.PLot  6  0.484449
44         41385.PLot  7 0.4869206
45         41394.PLot 12 0.5272433
46         41402.PLot 12 0.4404443
47         41452.PLot  7 0.6578695
48         41457.PLot  7 0.6578695
49         41458.PLot  8 0.7159932

Сообщение об ошибке так же просто, как кажется. Как правило, если все значения в столбце / переменной идентичны, это означает, что вы обязательно получите ошибку. Я бы посоветовал вам сначала проверить и удалить переменные с нулевой дисперсией. Вот что у меня сработало:

      # Load dplyr
library(dplyr)

# Load your data and assign it the name, df
# *code to load data goes here*

# Etract names for numeric columns
numeric_vars<-df%>%select_if(is.numeric)%>%names()

# Extract zero variance variables first
zero_var_columns<-nearZeroVar(df, saveMetrics = TRUE)%>%
filter(zeroVar==TRUE)%>%
row.names()

# Show
zero_var_columns

# Drop zero variance columns
df<-df%>%
select(-zero_var_columns)

# Now test for normality
df%>%
select_if(is.numeric)%>%
sapply(shapiro.test)%>%
t()%>%
data.frame()%>%
select(p.value)%>%
mutate(Is_normally_distributed=p.value>=.05)
Другие вопросы по тегам