你好!进行玉米的 **NCII(North Carolina Design II,北卡罗来纳II设计...

बनाया गया: 23 जनवरी 2026

का उपयोग करके उत्तर दिया गया GPT-5.2 Thinking द्वारा Chat01

प्रश्न

你好!进行玉米的 NCII(North Carolina Design II,北卡罗来纳II设计) 分析是一个非常经典的数量遗传学操作。这种设计本质上是一个 析因设计(Factorial Design),即每一个选定的父本都要与每一个选定的母本进行杂交。

NCII 分析的核心目的是为了评估 配合力(Combining Ability)遗传方差分量(加性方差和显性方差)。

你目前只有“样本名、母本、父本”这三列名单是不够的,你还需要表型数据(如产量、株高、穗位等)和**重复(Replication)**信息。

以下是完整的操作指南,从数据整理到分析方法的落地:


第一步:检查并整理 Excel 数据

NCII 分析要求数据结构非常严谨。请检查你的 Excel 数据是否满足以下条件,并按建议格式整理:

1. 数据完整性检查
NCII 设计通常是将父本(Male)和母本(Female)分组。假设你有 个父本和 个母本,你应该有 个杂交组合。

  • 关键点: 确认你的数据里,是否每一个选定的父本都和每一个选定的母本有了杂交后代?如果缺失很多组合,数据将是非平衡的,分析会变得很复杂。

2. 补充必要列
你需要将 Excel 整理成“长数据(Long Format)”格式。除了家系信息,必须加上田间试验的重复(Rep)和性状数值

推荐的 Excel 格式:

样本名 (Cross ID)母本 (Female)父本 (Male)重复 (Rep)产量 (Yield)株高 (Plant Height)...其他性状
Hybrid_1F1M11650.5210...
Hybrid_1F1M12640.2212...
Hybrid_2F1M21680.0205...
.....................

注意: 如果你的试验是在多个地点(Environments)进行的,还需要增加一列“地点(Env)”。


第二步:理解统计模型

在操作软件之前,你需要理解 NCII 的统计模型,这样看结果才不会晕。

对于单环境下的 NCII 设计,其线性模型通常表示为:

其中:

  • :观测值(表型数据)。
  • :总体均值。
  • :重复效应(Block effect)。
  • 父本效应(对应 GCA,一般配合力)。
  • 母本效应(对应 GCA,一般配合力)。
  • 父本与母本的互作效应(对应 SCA,特殊配合力)。
  • :随机误差。

第三步:选择分析工具与操作

有了整理好的 Excel,你可以选择以下几种方式进行分析。对于玉米育种,强烈推荐使用 R语言,因为它免费且专业包最全。

方案 A:使用 R 语言(最推荐,专业且免费)

你需要安装 R 和 RStudio。我们将使用 agricolae 包或者基础的 aov 函数。

操作代码模板:

r
# 1. 加载数据 (假设你的文件名为 corn_data.csv) library(readxl) data <- read_excel("你的文件路径.xlsx") # 2. 确保分类变量是因子 (Factor) 格式 data$Male <- as.factor(data$Male) data$Female <- as.factor(data$Female) data$Rep <- as.factor(data$Rep) # 3. 运行方差分析 (ANOVA) # 这是一个标准的析因设计模型 model <- aov(Yield ~ Rep + Male + Female + Male:Female, data = data) # 4. 查看结果 summary(model) # 5. 计算配合力 (GCA 和 SCA) # 如果你需要具体的效应值,可以使用 model.tables effects <- model.tables(model, type = "effects", se = TRUE) print(effects)

如何解读 R 的结果:

  • Male (父本) 的 Mean Sq 代表父本 GCA 方差。
  • Female (母本) 的 Mean Sq 代表母本 GCA 方差。
  • Male:Female (交互) 的 Mean Sq 代表 SCA 方差。
  • 遗传解释: 在 NCII 中,GCA 方差主要反映加性遗传方差 (Additive Variance),SCA 方差主要反映显性遗传方差 (Dominance Variance)。

方案 B:使用 SPSS(适合不习惯写代码的用户)

  1. 导入 Excel 数据。
  2. 菜单栏选择:Analyze (分析) -> General Linear Model (一般线性模型) -> Univariate (单变量)
  3. Dependent Variable (因变量): 放入性状(如产量)。
  4. Fixed Factors (固定因子): 放入 Rep(重复)、Male(父本)、Female(母本)。
  5. 点击 Model (模型): 选择 "Custom"(自定义),构建主效应 (Male, Female, Rep) 和 交互效应 (Male * Female)。
  6. 运行并查看 ANOVA 表。

方案 C:使用专业育种软件 (AGD-R, SAS)

如果你有 AGD-R (Analysis of Genetic Designs with R),这是一个基于 R 但有图形界面的工具,专门由 CIMMYT(国际玉米小麦改良中心)开发,非常适合做 NCII 分析。它能直接输出 GCA/SCA 和遗传力。


第四步:你需要关注的关键指标

做完分析后,你要从结果中提取玉米育种关注的核心信息:

  1. 显著性检验 (P-value):
  • 父本和母本效应显著吗?(说明 GCA 差异大,亲本选配很重要)。
  • 互作效应显著吗?(说明 SCA 差异大,特定的组合有杂种优势)。
  1. 方差分量 (Variance Components):
  • 计算 (加性) 和 (显性)。
  • 如果是玉米,通常 SCA 方差占比较大,说明杂种优势利用很重要。
  1. 遗传力 (Heritability):
  • 狭义遗传力 () = 加性方差 / 总表型方差。这对你预测选择效果至关重要。

总结与下一步

目前你需要做的第一件事是:
除了名单,你需要把田间的测产数据填入 Excel,并确认是否每个父本都和每个母本杂交了(构成矩阵)。

我可以为你做什么:
如果你已经有了带数据的 Excel 文件,你可以描述一下你的数据表头(具体的列名),我可以为你写一段不需要修改直接能用的 R 语言代码,帮你算出 GCA 和 SCA。你需要我这样做吗?
是的,我需要。列名:"hybrid" "mom"    "dad"    "ph_1"   "ear_1"  "mu_1"   "ph_2"   "ear_2"  "mu_2".
其中hybrid是样本名,mom dad 是母本父本,_1 _2 是第1/2次重复。

विचार

Considering user request for R code

The user wants R code that works directly with their data in wide format (ph_1, ph_2, etc.), reshaped to long. The request involves NCII analysis per trait, including computing ANOVA, GCA/SCA effects, and variance components. I'll use readxl and tidyverse, and include a placeholder for the file path, assuming "corn.xlsx". File detection can also use file.choose() for interactivity, no modification necessary from the user.

Outlining analysis and code structure

We’ll create a script to load the necessary packages, read the Excel file dynamically with file.choose(), and reshape the data to long format using pivot_longer. Then, I'll fit models for each trait, using aov for fixed effects and lmer for random effects (including parents as random). For variance components, I'll compute the necessary statistics—sigma values and additive variance.

Clarifying NCII variance formula

Alright, so for NCII, the formula for additive variance is typically 2*(σ²_GCA_male + σ²_GCA_female). But this depends on coding and half-sib covariance. In diploids, σ²_male and σ²_female might each be (1/4)σ²_A, and SCA variance is likely (1/4)σ²_D. I'll clarify and derive expected MS for these components.

Clarifying GCA variance calculations

For variance components, the GCA variance is σ²_g, and additive variance σ²_A = 4σ²_g. In NCII with both sexes random, there are separate GCA variances for male and female. Under symmetrical assumptions, these represent 1/4σ_A, and we can average them. A common formula is σ_A = 2(σ²_male + σ²_female).

Outlining code for GCA/SCA analysis

To analyze GCA and SCA effects, I’ll write R code that reads the Excel file, reshapes the data, and fits models (aov and lmer) for each trait. I'll calculate GCA effects using emmeans and extract SCA effects from random effects (ranef). The final results will be exported to Excel. The code will follow flexible patterns to handle any number of reps.

Thought for 53s

उत्तर

下面这段 R 脚本可以直接吃你现在这张“宽表”(ph_1 / ph_2 …),自动转成长表,然后对每个性状(ph / ear / mu)分别做:

  • NCII 方差分析(ANOVA:Rep + mom + dad + mom:dad)
  • 随机效应模型(lmer)估计方差分量:母本GCA、父本GCA、SCA、残差
  • 输出 GCA(mom、dad)SCA(mom×dad) 的效应值(用 BLUP:ranef)
  • 计算一套常用的 σA(加性)/ σD(显性)/ h²(按组合均值的近似狭义遗传力)
  • 把结果写到一个 NCII_results.xlsx(每个性状一组sheet)

你不用改列名;读文件用 file.choose(),会弹窗让你选 Excel。

r
## ========================= ## NCII (North Carolina Design II) analysis for your wide-format Excel ## Columns: hybrid, mom, dad, ph_1, ear_1, mu_1, ph_2, ear_2, mu_2 ## ========================= ## 0) Packages pkgs <- c("readxl", "dplyr", "tidyr", "stringr", "lme4", "broom", "writexl") to_install <- pkgs[!pkgs %in% rownames(installed.packages())] if (length(to_install) > 0) install.packages(to_install, dependencies = TRUE) invisible(lapply(pkgs, require, character.only = TRUE)) ## 1) Read Excel (interactive file picker) dat0 <- readxl::read_excel(path = file.choose()) ## 2) Basic checks required_cols <- c("hybrid", "mom", "dad") missing_required <- setdiff(required_cols, names(dat0)) if (length(missing_required) > 0) { stop("Missing required columns: ", paste(missing_required, collapse = ", ")) } ## 3) Pivot from wide -> long ## Any column ending with _<number> will be treated as trait_rep ## e.g., ph_1, ear_2, mu_2 ... dat_long <- dat0 %>% dplyr::mutate( hybrid = as.character(hybrid), mom = as.factor(mom), dad = as.factor(dad) ) %>% tidyr::pivot_longer( cols = dplyr::matches("_.+\\d+$|_\\d+$"), # tolerant names_to = c("trait", "Rep"), names_pattern = "^(.+)_([0-9]+)$", values_to = "y" ) %>% dplyr::mutate( trait = as.factor(trait), Rep = as.factor(Rep), y = suppressWarnings(as.numeric(y)) ) %>% dplyr::filter(!is.na(y)) if (nrow(dat_long) == 0) stop("No numeric phenotype values found after pivot_longer().") ## Optional: Use sum-to-zero contrasts to make 'effects' more interpretable options(contrasts = c("contr.sum", "contr.poly")) ## 4) Helper functions fit_one_trait <- function(df_trait) { # Fixed-effects ANOVA (classic factorial) aov_fit <- aov(y ~ Rep + mom + dad + mom:dad, data = df_trait) aov_tab <- broom::tidy(aov_fit) # Random-effects model for variance components # Rep kept as fixed (common in field trials with reps) lmer_fit <- lme4::lmer(y ~ Rep + (1|mom) + (1|dad) + (1|mom:dad), data = df_trait, REML = TRUE) vc <- as.data.frame(lme4::VarCorr(lmer_fit)) # vc columns: grp, var1, var2, vcov, sdcor get_v <- function(grp_name) { out <- vc$vcov[vc$grp == grp_name] if (length(out) == 0) return(0) out[1] } v_mom <- get_v("mom") v_dad <- get_v("dad") v_momdad <- get_v("mom:dad") v_resid <- get_v("Residual") r <- dplyr::n_distinct(df_trait$Rep) # Common NCII mapping (diploid, no epistasis assumptions): # Var(mom GCA) ~ 1/4 σA ; Var(dad GCA) ~ 1/4 σA => σA ≈ 2*(v_mom + v_dad) # Var(SCA) ~ 1/4 σD => σD ≈ 4*v_momdad sigma_A <- 2 * (v_mom + v_dad) sigma_D <- 4 * v_momdad # Narrow-sense heritability on hybrid MEAN (approx): # h2 ≈ σA / (σA + σD + σe/r) h2_mean <- ifelse((sigma_A + sigma_D + v_resid / r) > 0, sigma_A / (sigma_A + sigma_D + v_resid / r), NA_real_) varcomp <- dplyr::tibble( component = c("V_mom(GCA)", "V_dad(GCA)", "V_mom:dad(SCA)", "V_residual", "sigma_A(≈2*(V_mom+V_dad))", "sigma_D(≈4*V_SCA)", "h2_mean(≈sigmaA/(sigmaA+sigmaD+Ve/r))", "nRep"), value = c(v_mom, v_dad, v_momdad, v_resid, sigma_A, sigma_D, h2_mean, r) ) # BLUPs for GCA/SCA (random effects) re <- lme4::ranef(lmer_fit) gca_mom <- re$mom %>% tibble::rownames_to_column("mom") %>% dplyr::rename(GCA_mom = `(Intercept)`) %>% dplyr::arrange(dplyr::desc(GCA_mom)) gca_dad <- re$dad %>% tibble::rownames_to_column("dad") %>% dplyr::rename(GCA_dad = `(Intercept)`) %>% dplyr::arrange(dplyr::desc(GCA_dad)) sca <- re[["mom:dad"]] %>% tibble::rownames_to_column("mom_dad") %>% dplyr::rename(SCA = `(Intercept)`) %>% tidyr::separate(mom_dad, into = c("mom", "dad"), sep = ":", remove = TRUE) %>% dplyr::arrange(dplyr::desc(SCA)) # Hybrid means (useful for ranking) means <- df_trait %>% dplyr::group_by(hybrid, mom, dad) %>% dplyr::summarise(mean_y = mean(y, na.rm = TRUE), .groups = "drop") %>% dplyr::arrange(dplyr::desc(mean_y)) list( aov_table = aov_tab, varcomp = varcomp, gca_mom = gca_mom, gca_dad = gca_dad, sca = sca, means = means ) } ## 5) Run by trait and collect outputs traits <- levels(dat_long$trait) if (is.null(traits) || length(traits) == 0) traits <- unique(as.character(dat_long$trait)) out_sheets <- list() for (tr in traits) { df_tr <- dat_long %>% dplyr::filter(trait == tr) # skip if too small if (nrow(df_tr) < 5) next res <- fit_one_trait(df_tr) # Put into separate sheets (Excel sheet name limit ~31 chars) tr_safe <- stringr::str_replace_all(as.character(tr), "[\$$\$$\\*\\?/\\\\:]", "_") tr_safe <- substr(tr_safe, 1, 20) out_sheets[[paste0(tr_safe, "_ANOVA")]] <- res$aov_table out_sheets[[paste0(tr_safe, "_VarComp")]] <- res$varcomp out_sheets[[paste0(tr_safe, "_GCA_mom")]] <- res$gca_mom out_sheets[[paste0(tr_safe, "_GCA_dad")]] <- res$gca_dad out_sheets[[paste0(tr_safe, "_SCA")]] <- res$sca out_sheets[[paste0(tr_safe, "_Means")]] <- res$means } if (length(out_sheets) == 0) stop("No trait results generated. Check your trait columns like ph_1, ph_2 ...") ## 6) Write results to Excel writexl::write_xlsx(out_sheets, path = "NCII_results.xlsx") message("Done! Results saved to: NCII_results.xlsx")

你跑完以后,重点看:

  • *_ANOVAmom / dad / mom:dad 的显著性(对应 GCA / GCA / SCA)
  • *_VarCompsigma_Asigma_Dh2_mean
  • *_GCA_mom*_GCA_dad:每个亲本的 GCA(正值通常表示对性状贡献高,取决于性状方向)
  • *_SCA:具体组合的 SCA(杂种优势/特配)

如果你希望我帮你把 “ph/ear/mu”重命名成更直观的性状名,或者你有 多地点 Env(需要加 Env 和交互项),把你的表头/示例两三行贴出来,我可以把模型扩展成多环境的 NCII(含 GCA×Env、SCA×Env)。

इस प्रश्नोत्तर को साझा करें