CF F. Royal Questions kruskal

Code: 

#include<bits/stdc++.h> 
#define ll long long  
#define maxn 200004 
using namespace std;  
void setIO(string s) {
    string in=s+".in"; 
    freopen(in.c_str(),"r",stdin); 
}
int n,m;   
int p[maxn],tag[maxn]; 
void init() {
    for(int i=0;i<maxn;++i) p[i]=i;  
} 
int find(int x) {
    return p[x]==x?x:p[x]=find(p[x]);  
}
struct Edge { 
    int u,v,c; 
}ed[maxn];         
bool cmp(Edge a,Edge b) {
    return a.c>b.c; 
}
int main() {
    // setIO("input");  
    init(); 
    scanf("%d%d",&n,&m);   
    for(int i=1;i<=m;++i) scanf("%d%d%d",&ed[i].u,&ed[i].v,&ed[i].c);   
    sort(ed+1,ed+1+m,cmp);  
    ll ans=0; 
    for(int i=1;i<=m;++i) {
        int a=find(ed[i].u), b=find(ed[i].v);       
        if(a!=b&&(!tag[a]||!tag[b])) ans+=1ll*ed[i].c, tag[a]|=tag[b], p[b]=a; 
        else if(a==b && !tag[a]) ans+=1ll*ed[i].c, tag[a]=1;         
    }   
    printf("%I64d\n",ans); 
    return 0; 
}

  

<think> 我们正在讨论的是:当进行多个Kruskal-Wallis检验时(例如分析多个变量),部分变量的全局P值小于0.05,部分不显著(即部分小于0.05,部分大于0.05)。此时,对于这些变量,是否可以对那些全局P值小于0.05的变量进行Dunn事后检验? 关键点: 1. Kruskal-Wallis检验是一个全局检验,用于判断多个独立组之间是否存在至少一个组与其他组有差异(原假设是所有组的中位数相等)。 2. 每个变量单独进行Kruskal-Wallis检验,每个检验得到一个全局P值。 3. 对于某个变量,只有当其全局P值小于显著性水平(通常为0.05)时,才需要进行事后检验(如Dunn检验)以确定具体哪些组之间存在差异。 4. 但是,如果同时检验多个变量(多重检验),即使每个变量单独检验,我们也会面临多重比较问题(即增加I类错误的风险)。因此,我们需要对多个Kruskal-Wallis检验的P值进行多重检验校正。 因此,步骤应该是: a) 对于每个变量,进行Kruskal-Wallis检验,得到全局P值。 b) 由于有多个变量,我们首先需要对这些全局P值进行多重检验校正(例如Bonferroni、FDR等)。 c) 对于校正后仍然显著的变量(即校正后的P值<0.05),我们才进行Dunn事后检验。 注意:Dunn检验本身也会涉及多次两两比较,因此在进行Dunn检验时,也需要对Dunn检验的P值进行多重比较校正(这一步是必须的,无论是否进行了全局P值的校正)。 所以,回到问题: 如果多个变量中,部分变量的Kruskal-Wallis检验原始P值小于0.05(即部分显著),部分不显著,那么: - 首先,对所有这些Kruskal-Wallis检验的P值进行多重校正(例如Bonferroni校正)。 - 然后,只对那些校正后P值仍然显著的变量进行Dunn事后检验。 - 在进行Dunn事后检验时,还需要对每个变量的所有两两比较进行多重比较校正(例如Bonferroni、Benjamini-Hochberg等)。 注意:这里有两个层次的多重校正: 第一层:多个假设检验(多个变量)的校正,确保总体错误率不膨胀。 第二层:对于每个显著的变量,进行组间两两比较时,也需要校正(因为一个变量内多次两两比较)。 因此,不能直接对原始P值小于0.05的变量就进行Dunn检验,而是要先校正多个Kruskal-Wallis检验的P值。 引用之前的描述性统计规则[^1],对于非正态分布的连续变量,我们使用Kruskal-Wallis检验,然后进行事后检验(如Dunn检验)是合适的。 总结回答: - 当同时分析多个变量时,即使部分变量的Kruskal-Wallis检验原始P值小于0.05,也不能直接进行Dunn检验。 - 必须首先对多个Kruskal-Wallis检验的P值进行多重检验校正(例如Bonferroni校正:将显著性水平调整为$0.05/m$,其中$m$为变量个数;或者使用FDR校正)。 - 只有校正后仍然显著的变量,才需要进行Dunn事后检验。 - 对于每个需要Dunn检验的变量,在Dunn检验中还要对两两比较的P值进行多重比较校正(例如Bonferroni、Holm等方法)。 注意:如果只分析一个变量,那么只要该变量的Kruskal-Wallis检验P值<0.05,就可以进行Dunn检验(但Dunn检验内部仍需校正两两比较)。 示例: 假设同时分析3个变量(A、B、C),Kruskal-Wallis检验的原始P值分别为:0.04, 0.03, 0.25。 使用Bonferroni校正,显著性水平调整为0.05/3≈0.0167。 则只有第二个变量(0.03)校正后不显著(因为0.03>0.0167?不对,Bonferroni校正后,我们比较校正后的P值:第一个变量校正后P值为0.04*3=0.12,第二个为0.03*3=0.09,第三个为0.25*3=0.75,均大于0.05,所以都不显著)。因此,这三个变量都不需要进行Dunn检验。 另一种做法:调整显著性水平,即每个变量使用0.0167的阈值判断。那么原始P值0.04和0.03都大于0.0167(因为0.04>0.0167,0.03>0.0167),所以都不显著。 因此,不能仅凭原始P值部分小于0.05就进行事后检验,必须先校正。 结论:在多个变量的情况下,即使部分变量的原始Kruskal-Wallis检验P值小于0.05,也必须先校正,只有校正后显著的变量才进行Dunn检验。 注意:多重检验校正方法的选择取决于研究目的。如果是为了控制族错误率(FWER),使用Bonferroni;如果控制错误发现率(FDR),可以使用Benjamini-Hochberg方法(BH)。 另外,在引用[2]中提到了过度离散(Overdispersion)问题,这主要与计数数据(count data)的分布有关,例如泊松分布假设方差等于均值,当方差远大于均值时,泊松分布就不适用,而应采用负二项分布。但是,这与我们当前讨论的非参数检验问题无关,因为Kruskal-Wallis检验不要求数据服从正态分布,也不涉及计数数据的分布假设(它是基于秩的检验)。 因此,根据以上分析,回答用户的问题: 用户问题:Kruskal-Wallis检验中部分结果显示显著(Yes),部分不显著(No),结合全局P值有部分小于0.05的情况,能否进行Dunn事后检验? 回答: - 如果存在多个变量(即同时进行了多个Kruskal-Wallis检验),则不能直接对原始P值小于0.05的变量进行Dunn检验。 - 必须先对多个Kruskal-Wallis检验的P值进行多重检验校正。 - 只有校正后仍然显著的变量,才需要(且应该)进行Dunn事后检验。 - 对于单个变量,只要其Kruskal-Wallis检验的P值小于0.05(无需多重校正)即可进行Dunn检验,但Dunn检验内部的两两比较仍需校正。 因此,关键在于:您是否同时进行了多个假设检验(即多个变量)?如果是,则必须进行多重校正。 注意:如果多个检验是预先计划的、独立的,并且有明确的研究假设,也可以考虑不校正,但这需要事先确定。通常,为了控制总体错误率,建议校正。 最后,在实施Dunn检验时,务必使用多重比较校正方法(如Bonferroni、Holm或BH等)调整两两比较的P值。 示例代码(R语言): ```r # 假设有三个变量:var1, var2, var3,分组变量group # 第一步:对每个变量进行Kruskal-Wallis检验 p_values <- c( kruskal.test(var1 ~ group)$p.value, kruskal.test(var2 ~ group)$p.value, kruskal.test(var3 ~ group)$p.value ) # 第二步:多重检验校正(例如Bonferroni) adjusted_p <- p.adjust(p_values, method = "bonferroni") # 第三步:对校正后显著的变量进行Dunn检验 # 例如,如果第一个变量校正后显著(adjusted_p[1] < 0.05) if (adjusted_p[1] < 0.05) { # 使用FSA包的dunnTest函数,注意校正方法 library(FSA) dunnTest(var1 ~ group, method = "bonferroni") # 或者使用其他方法,如"holm" } ``` 注意:不同软件包中Dunn检验的校正方法参数可能不同,请查阅具体文档。 因此,结论是:不能仅根据原始P值部分小于0.05就进行Dunn检验,必须考虑多重检验校正。 </think> ### 解答:Kruskal-Wallis检验中部分变量显著时的Dunn检验执行原则 根据统计检验的规范流程,当存在多个变量时,**不能仅凭部分变量的Kruskal-Wallis检验P值<0.05就进行Dunn事后检验**。具体决策流程如下: #### ✅ 可执行Dunn检验的条件 1. **单一变量全局显著** 若分析的是**单个变量**,且其Kruskal-Wallis检验的全局P值<0.05(例如$P=0.03$),则需进行Dunn检验: ```r # R示例:单个变量检验 kruskal.test(variable1 ~ group)$p.value < 0.05 # 返回TRUE时才需Dunn检验 ``` 2. **多重校正后显著** 若同时分析多个变量(如变量A、B、C),必须**先校正多重比较**: ```r # Bonferroni校正(变量数k=3) alpha_adj <- 0.05/3 # α=0.0167 kw_p <- c(0.04, 0.03, 0.25) # 三个变量的原始P值 kw_p < alpha_adj # [FALSE, FALSE, FALSE] → 均不显著 ``` 仅当校正后$P_{\text{adj}} < 0.05$的变量才需Dunn检验[^1]。 #### ❌ 禁止执行Dunn检验的情形 1. **未校正的部分显著** 示例:3个变量的原始P值为$[0.04, 0.03, 0.25]$,虽有两项<0.05: - 假阳性风险高达$1-(1-0.05)^2≈9.75\%$(远超过5%) - 此类"部分显著"属统计假象,本质是**多重比较未校正**的结果。 2. **全局P值>0.05的变量** 即使其他变量显著,对$P>0.05$的变量执行Dunn检验会**人为扩大I类错误**: $$P(\text{至少1次假阳性}) = 1 - (1-\alpha)^m \quad (m=\text{比较次数})$$ #### 规范操作流程 ```mermaid graph TD A[同时检验k个变量] --> B[计算每个变量的KW P值] B --> C{是否k>1?} C -->|是| D[校正多重比较<br>Bonferroni/BH] C -->|否| E[直接判断P<0.05] D --> F[筛选校正后P<0.05的变量] E --> F F --> G[仅对显著变量执行Dunn检验] G --> H[Dunn检验内部进行组间两两比较校正] ``` #### 示例解析 某研究分析3个生理指标(血压、心率、血氧): | 变量 | K-W P值 | Bonferroni校正 | 是否Dunn检验 | |--------|---------|----------------|--------------| | 血压 | 0.04 | 0.12 (0.04×3) | 否 | | 心率 | 0.03 | 0.09 (0.03×3) | 否 | | 血氧 | 0.25 | 0.75 (0.25×3) | 否 | **结论**:虽有两个变量原始P值<0.05,但校正后均不显著,**禁止**进行任何Dunn检验。 > **核心原则**:Dunn检验必须建立在**校正后显著的全局检验基础上**。未经校正的"部分显著"本质是多重比较谬误,强行检验将导致假阳性结论[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值