获取具有两个变量和多个行名的 p 值

Posted

技术标签:

【中文标题】获取具有两个变量和多个行名的 p 值【英文标题】:Get p-value with two variables and multiple row names 【发布时间】:2020-08-24 21:49:47 【问题描述】:

如果你能帮助我从这个简单的 data.frame 中测量 p 值,我会徘徊。我的数据框称为(my_data)。通过查看它,您可以看到我正在比较的相似值:

my_data <- read.csv("densityleftOK.csv", stringsAsFactors = FALSE [c(1,2,3),]

      P1    P2   P3  P4  P5   T1  T2  T3  T4  T5  T6
A     1008 1425 869 1205 954  797 722 471 435 628 925
B      550  443 317  477 337  383  54 111  27 239 379
C      483  574 597  375 593  553 249 325 238 354 411

因此,我想通过比较安慰剂与处理过的样本来为每一行获得一个 pvalue。如果您不介意,我还想获得安慰剂 (P) 和治疗 (T) 之间的标准差。

感谢您的帮助。 谢谢

【问题讨论】:

抱歉,您只给了我们 A:E 五个组的方法。对于 p 值和标准差,需要完整的数据。如果你向我们展示数据结构,有人可以给你 R 代码来自己计算。 感谢@Jan 的回复。我通过添加完整的数据来编辑数据。我认为现在可以了。谢谢:) 你想要做什么样的测试来得到 p 值? p 只不过是在特定假设下,您的数据看起来与它完全一样的概率。根据您的数据,我假设您想确定治疗和安慰剂值来自不同的人群。用简单的英语,你想表明它们是不同的。如果是这种情况,我需要知道治疗和安慰剂样本是否是重复测量。我认为它们是独立样本,对吗?最后,了解治疗是否应该增加或降低测量值会很有用。 是的,我确实想证明它们是不同的。列是单个组织样本,行是不同的组织区域。治疗应该降低测量值。 【参考方案1】:

您可以尝试以下方法,将数据转换为长格式,按 id 分组,引入分组向量(“P”或“T”)并在 t.test 上使用 tidy 将其包装在表格格式:

library(broom)
library(tidyr)
library(dplyr)
library(tibble)

data = read.table(text="P1    P2   P3  P4  P5   T1  T2  T3  T4  T5  T6
A     1008 1425 869 1205 954  797 722 471 435 628 925
B      550  443 317  477 337  383  54 111  27 239 379
C      483  574 597  375 593  553 249 325 238 354 411",header=TRUE,row.names=1)

res = data %>% 
rownames_to_column("id") %>% 
pivot_longer(-id) %>% 
mutate(grp=sub("[0-9]","",name)) %>% 
group_by(id) %>% 
do(tidy(t.test(value ~ grp,data=.))) %>%
select(c(id,estimate,estimate1,estimate2,statistic,p.value)) %>%
mutate(stderr = estimate/statistic)

# A tibble: 3 x 7
# Groups:   id [3]
  id    estimate estimate1 estimate2 statistic p.value stderr
  <chr>    <dbl>     <dbl>     <dbl>     <dbl>   <dbl>  <dbl>
1 A         429.     1092.      663       3.40 0.00950  126. 
2 B         226.      425.      199.      2.89 0.0192    78.2
3 C         169.      524.      355       2.65 0.0266    64.0

如果你不使用包..那么这是一个使用apply的问题,我想预先声明组更容易:

grp = gsub("[0-9]","",colnames(data))

res = apply(data,1,function(i)
data.frame(t.test(i~grp)[c("statistic","p.value","stderr")])
)

res = do.call(rbind,res)
  statistic     p.value    stderr
A  3.395303 0.009498631 126.40994
B  2.890838 0.019173060  78.16650
C  2.646953 0.026608838  63.99812

【讨论】:

那行得通。几厘米。首先,看看你的数据。使用您拥有的少数样本,很难确定您的数据是正态分布的。如果我们可以假设,t 检验只会给你下降结果。我看了一下,你的数据很分散。您可能需要寻找非参数检验或抽样方法。 还要考虑组织区域。您是否需要所有项来显示改善,或者当只有一个区域这样做时,您会认为您的治疗有效吗?在前一种情况下,你很好。在后者中,您必须更正进行多次测试。最简单的方法是 Bonferroni 校正。这基本上意味着您将 p 值乘以组织区域的数量。在这种情况下,只有第一个区域出现 最后,我们可以假设一个单方面的测试,因为只有通过治疗才能有所改善。默认情况下,R 中的 t 检验假定双边比较。将其添加到命令中,结果将对您更有利。 @Jan.对 OP 来说似乎是很好的统计建议,你当然可以创建一个聊天室,在他的问题下留下更多的 cmets,或者自己发布一个答案。这种性质的问题或讨论更适合stats.stackexchange.com/questions

以上是关于获取具有两个变量和多个行名的 p 值的主要内容,如果未能解决你的问题,请参考以下文章

如何附加多个具有相同变量名的 .mat 文件?

如何从数据框中选择一些具有特定行名的行? [关闭]

f检验的p值和r值是啥意思?

如何查询多个表以获取表具有相同列名的记录

连接两个具有不同键名的表

数据库:如何从具有一个公共列的两个表中获取多个值