Арксинусное преобразование процентных данных - PullRequest
0 голосов
/ 04 мая 2019

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

(csv) HS.PvsPERC

Мой код (с использованием csv: HS.PvsPERC):

mydata<-read.csv(file.choose())

attach(mydata)
summary(mydata)
str(mydata)
head(mydata)
dput(mydata)

mydata <-
structure(list(Herd.size = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("Large", "Small"), class = "factor"), 
    Any.pregnant.in.herd. = structure(c(2L, 1L, 2L, 1L, 1L, 1L, 
    2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 
    2L, 2L, 2L, 2L, 2L, 1L), .Label = c("no clear evidence", 
    "pregnant"), class = "factor"), percentage.of.heads.up.at.halfway = c(0, 
    100, 80, 25, 57.14, 100, 0, 25, 50, 100, 100, 70, 100, 14.29, 
    26.67, 100, 50, 40, 67.65, 43.59, 5.41, 44.9, 41.5, 69.23, 
    14.29, 7.07, 6.05)), class = "data.frame", row.names = c(NA, 
-27L))

shapiro.test(mydata$percentage.of.heads.up.at.halfway)
length(percentage.of.heads.up.at.halfway)

mydatatrans<-asin(sqrt(mydata$percentage.of.heads.up.at.halfway))

Последняя строка выдает ошибку:

** Предупреждающее сообщение:
В asin (sqrt (mydata $ процент.of.heads.up.at.halfway)): произведенные NaN **

что я не уверен в том, как изменить / интерпретировать.


Я тоже пытался (как подсказали подсказки в других ответах):

trans.arcsine<-asin(sign(mydata)*sqrt(abs(mydata)))

** Ошибка в Math.data.frame (mydata): нечисловые переменные в фрейме данных: Herd.size, Any.pregnant.in.herd. **

(для любой беременной в колонне стада я использовал беременных, и нет четких доказательств - я должен сделать их числовыми, как 1 и 0 или что-то подобное?)

trans.arcsine<-function(mydata){asin(sign(mydata)*sqrt(abs(mydata)))}
trans.arcsine(Herd.size~Any.pregnant.in.herd.)

** Ошибка в знаке (mydata): нечисловой аргумент математической функции **

Я пытаюсь сравнить размер стада и беременность с процентным соотношением голов кверху, которое должно быть двухсторонним, но сначала нужно преобразовать данные.

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Ваш столбец варьируется от 0 до 100, и арксинус можно применять только к числам от 0 до 1. Я предполагаю, что эти проценты должны быть масштабированы от 0 до 1 путем деления на 100, а затем взять квадратный кореньдля измененного числа.

mydatatrans <- asin(sqrt(mydata$percentage.of.heads.up.at.halfway / 100))

Результаты для mydata в вопросе:

> mydatatrans
 [1] 0.0000000 1.5707963 1.1071487 0.5235988 0.8570431 1.5707963 0.0000000 0.5235988
 [9] 0.7853982 1.5707963 1.5707963 0.9911566 1.5707963 0.3876579 0.5426768 1.5707963
[17] 0.7853982 0.6847192 0.9657860 0.7211213 0.2347441 0.7343093 0.6999833 0.9827854
[25] 0.3876579 0.2691319 0.2485177

Редактировать:

Изменено имя фрейма данных с df наmydata.

0 голосов
/ 04 мая 2019

Вы можете сделать ответ пользователя R. Schifini более общим, определив функцию, которая позаботится о масштабировании для вас, а затем вычислит арксинус.

arcsin <- function(x, col = 3){
  scaled <- x[[col]]/diff(range(x[[col]]))
  asin(sqrt(scaled))
}

arcsin(mydata)
arcsin(mydata, 'percentage.of.heads.up.at.halfway')

Примечания:

  • col = 3 - это столбец ввода по умолчанию.
  • Если вы передаете имя столбца в аргументе col, это должна быть строка символов, то есть она должна быть заключена в кавычки, как во втором примере использования.
  • Для масштабирования используется diff и, следовательно, он не зависит от конкретного диапазона входного вектора.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...