Получение оценки и p-значения в датафрейме - PullRequest
0 голосов
/ 14 ноября 2018

Я довольно новичок в R. Мои данные выглядят примерно так (только с 9000 столбцами и 66 строками)

Time <- c(0, 6.4, 8.6, 15.2, 19.4, 28.1, 42.6, 73, 73, 85, 88, 88, 88, 88, 88)
ID1 <- c(55030, 54539, 54937, 48897, 58160, 54686, 55393, 47191, 39805, 37601, 51328, 28882, 45587, 60061, 31892, 28670)
ID2 <- c(20485, 11907, 10571, 20974, 10462, 11149, 20970, NA, NA, 9295, NA, 8714, 24446, 10748, 9037, 11859)
ID3 <- c(93914, 44482, 43705, 51144, 49485, 43908, 44324, 37342, 18872, 39660,61673, 43837, 36528, 44738, 41648, 11100)
DF <- data.frame (Time, ID1, ID2, ID3)

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

ID1, rho, p-значение

ID2, rho, p-значение

...

rho и p-значение будут результатомcor.test (spearman) со временем и каждым ID

Среди прочего я пробовал это:

results <- data.frame(ID="", Estimate="", P.value="")
estimates = numeric(16)
pvalues = numeric(16)
for (i in 2:4){
  test <- cor.test(DF[,1], DF[,i])
  estimates[i] = test$estimate
  pvalues[i] = test$p.value
}

И R выдает мне следующую ошибку:

Error: object 'test' not found

Я также пытался:

result <- do.call(rbind,lapply(2:4, function(x) {
  cor.result<-cor.test(DF[,1],DF[,x])
  pvalue <- cor.result$p.value
  estimate <- cor.result$estimate
  return(data.frame(pvalue = pvalue, estimate = estimate))
})
)

И R выдает мне похожую ошибку

Error: object 'cor.result' not found

Я уверен, что это легко исправить, но я не могу понять этоиз.Любая помощь приветствуется.

Это то, что я получил после запуска

dput(head(SmallDataset[,1:5]))

structure(list(Species = c("Human.hsapiens", "Chimpanzee.ptroglodytes", 
"Gorilla.ggorilla", "Orangutan.pabelii", "Gibbon.nleucogenys", 
"Macaque.mmulatta"), Time = c(0, 6.4, 8.61, 15.2, 19.43, 28.1
), ID1 = c(55030, 54539, 54937, 48897, 58160, 54686), ID2 = c(20485, 
11907, 10571, 20974, 10462, 11149), ID3 = c(93914, 44482, 43705, 
51144, 49485, 43908)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Подумайте о создании списка фреймов данных с lapply (итерационная функция, аналогичная for, но в качестве входных данных создается список объектов равной длины).После этого строка связывает все элементы фрейма данных вместе:

results <- lapply(2:4, function(i){      
  test <- cor.test(DF[,1], DF[,i])

  data.frame(ID = names(DF)[i],
             estimate =  unname(test$estimate),
             pvalues = unname(test$p.value))      
})

final_df <- do.call(rbind, results)
final_df

#    ID   estimate     pvalues
# 1 ID1 -0.6238591 0.009805341
# 2 ID2 -0.2270515 0.455676037
# 3 ID3 -0.4964092 0.050481533

ПРИМЕЧАНИЕ. В опубликованных данных за Время отсутствует наблюдение, и их нельзя сразу преобразовать в data.frame() с другими векторами.Чтобы решить, я добавил 6-е 88 в конце:

Time <- c(0, 6.4, 8.6, 15.2, 19.4, 28.1, 42.6, 73, 73, 85, 88, 88, 88, 88, 88, 88)

Использование опубликованного SmallDataset:

SmallDataset <- structure(...)

results <- lapply(3:5, function(i){      
  test <- cor.test(SmallDataset$Time, SmallDataset[,i])

  data.frame(ID = names(SmallDataset)[i],
             estimate =  unname(test$estimate),
             pvalues = unname(test$p.value))      
})

final_df <- do.call(rbind, results)
final_df

#    ID    estimate   pvalues
# 1 ID1  0.03251407 0.9512461
# 2 ID2 -0.41733336 0.4103428
# 3 ID3 -0.60732484 0.2010166
0 голосов
/ 14 ноября 2018

Мое решение заключается в определении функции внутри вызова lapply

##
library(dplyr)

###Create dataframe
Time <- c(0, 6.4, 8.6, 15.2, 19.4, 28.1, 42.6, 73, 73, 85, 88, 88, 88, 88, 88, 89)
ID1 <- c(55030, 54539, 54937, 48897, 58160, 54686, 55393, 47191, 39805, 37601, 51328, 28882, 45587, 60061, 31892, 28670)
ID2 <- c(20485, 11907, 10571, 20974, 10462, 11149, 20970, NA, NA, 9295, NA, 8714, 24446, 10748, 9037, 11859)
ID3 <- c(93914, 44482, 43705, 51144, 49485, 43908, 44324, 37342, 18872, 39660,61673, 43837, 36528, 44738, 41648, 11100)
DF <- data.frame (Time, ID1, ID2, ID3)

##Run the correlations
l2 <- lapply(2:4, function(i)cor.test(DF$Time, DF[,i]))

##Define function to extract p_value and coefficients
l3 <- lapply(l2, function(i){
  return(tibble(estimate = i$estimate,
         p_value = i$p.value))
})

##Create a dataframe with information
l4 <- bind_rows(l3) %>% mutate(ID = paste0("ID", 1:3)) ##Data frame with info

l4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...