代码之家  ›  专栏  ›  技术社区  ›  Ammar Sabir Cheema

对重复治疗而不是参数执行pca

  •  0
  • Ammar Sabir Cheema  · 技术社区  · 6 年前

    我有一个数据集的形式,列1包含治疗名称,其余列包含这些治疗的值,每个治疗有三个重复。为了举例说明,我使用iris数据集创建了模拟数据集,如下所示:

    df <- read.table(text = '"Treatment" "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
    "treatment_a" 5.1 3.5 1.4 0.2
    "treatment_a" 4.9 3 1.4 0.2
    "treatment_a" 4.7 3.2 1.3 0.2
    "treatment_b" 4.6 3.1 1.5 0.2
    "treatment_b" 5 3.6 1.4 0.2
    "treatment_b" 5.4 3.9 1.7 0.4
    "treatment_c" 4.6 3.4 1.4 0.3
    "treatment_c" 5 3.4 1.5 0.2
    "treatment_c" 4.4 2.9 1.4 0.2
    "treatment_d" 4.9 3.1 1.5 0.1
    "treatment_d" 5.4 3.7 1.5 0.2
    "treatment_d" 4.8 3.4 1.6 0.2
    "treatment_e" 4.8 3 1.4 0.1
    "treatment_e" 4.3 3 1.1 0.1
    "treatment_e" 5.8 4 1.2 0.2
    "treatment_f" 5.7 4.4 1.5 0.4
    "treatment_f" 5.4 3.9 1.3 0.4
    "treatment_f" 5.1 3.5 1.4 0.3
    "treatment_g" 5.7 3.8 1.7 0.3
    "treatment_g" 5.1 3.8 1.5 0.3
    "treatment_g" 5.4 3.4 1.7 0.2
    "treatment_h" 5.1 3.7 1.5 0.4
    "treatment_h" 4.6 3.6 1 0.2
    "treatment_h" 5.1 3.3 1.7 0.5', header = TRUE)
    

    我想用R在这个数据集上执行pca,方法是在图上绘制具有复制的治疗,而不是在变量上,治疗名称也应该在图上标记。 我在stackoverflow上查找了类似的问题,但没有找到与我的问题类似的问题。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nick Criswell    6 年前

    原始响应

    ggplot2

    我还增加了一个颜色审美锅。如果你不想的话,可以把那部分删掉。

    df <- read.table(text = '"Treatment" "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
    "treatment_a" 5.1 3.5 1.4 0.2
    "treatment_a" 4.9 3 1.4 0.2
    "treatment_a" 4.7 3.2 1.3 0.2
    "treatment_b" 4.6 3.1 1.5 0.2
    "treatment_b" 5 3.6 1.4 0.2
    "treatment_b" 5.4 3.9 1.7 0.4
    "treatment_c" 4.6 3.4 1.4 0.3
    "treatment_c" 5 3.4 1.5 0.2
    "treatment_c" 4.4 2.9 1.4 0.2
    "treatment_d" 4.9 3.1 1.5 0.1
    "treatment_d" 5.4 3.7 1.5 0.2
    "treatment_d" 4.8 3.4 1.6 0.2
    "treatment_e" 4.8 3 1.4 0.1
    "treatment_e" 4.3 3 1.1 0.1
    "treatment_e" 5.8 4 1.2 0.2
    "treatment_f" 5.7 4.4 1.5 0.4
    "treatment_f" 5.4 3.9 1.3 0.4
    "treatment_f" 5.1 3.5 1.4 0.3
    "treatment_g" 5.7 3.8 1.7 0.3
    "treatment_g" 5.1 3.8 1.5 0.3
    "treatment_g" 5.4 3.4 1.7 0.2
    "treatment_h" 5.1 3.7 1.5 0.4
    "treatment_h" 4.6 3.6 1 0.2
    "treatment_h" 5.1 3.3 1.7 0.5', header = TRUE)
    
    # run principle components, ignore first column
    pr <- prcomp(df[, 2:5])
    
    # run predict to get the first and second principle components
    pr_pred <- predict(pr)
    
    # put this into a data frame so we can use ggplot
    df2 <- data.frame(Treatment = df$Treatment,
                      pr_pred[, 1:2])
    
    library(ggplot2)
    
    ggplot(data = df2, aes(x = PC1, y = PC2, 
                           colour = Treatment, 
                           label = Treatment)) + 
        geom_text()
    

    enter image description here

    添加椭圆

    要添加这些,我们必须更改有多少个类别。我们要三个。希望在你的实际数据集中,有足够的数据来绘制你正在寻找的椭圆。

    df_mod <- read.table(text = '"Treatment" "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
    "treatment_a" 5.1 3.5 1.4 0.2
                     "treatment_a" 4.9 3 1.4 0.2
                     "treatment_a" 4.7 3.2 1.3 0.2
                     "treatment_b" 4.6 3.1 1.5 0.2
                     "treatment_b" 5 3.6 1.4 0.2
                     "treatment_b" 5.4 3.9 1.7 0.4
                     "treatment_c" 4.6 3.4 1.4 0.3
                     "treatment_c" 5 3.4 1.5 0.2
                     "treatment_c" 4.4 2.9 1.4 0.2
                     "treatment_a" 4.9 3.1 1.5 0.1
                     "treatment_a" 5.4 3.7 1.5 0.2
                     "treatment_a" 4.8 3.4 1.6 0.2
                     "treatment_b" 4.8 3 1.4 0.1
                     "treatment_b" 4.3 3 1.1 0.1
                     "treatment_b" 5.8 4 1.2 0.2
                     "treatment_c" 5.7 4.4 1.5 0.4
                     "treatment_c" 5.4 3.9 1.3 0.4
                     "treatment_c" 5.1 3.5 1.4 0.3
                     "treatment_a" 5.7 3.8 1.7 0.3
                     "treatment_a" 5.1 3.8 1.5 0.3
                     "treatment_b" 5.4 3.4 1.7 0.2
                     "treatment_b" 5.1 3.7 1.5 0.4
                     "treatment_c" 4.6 3.6 1 0.2
                     "treatment_c" 5.1 3.3 1.7 0.5', header = TRUE)
    
    
    pr_mod <- prcomp(df_mod[, 2:5])
    pr_pred_mod <- predict(pr_mod)
    
    df2_mod <- data.frame(Treatment = df_mod$Treatment,
                      pr_pred_mod[, 1:2])
    
    ggplot(data = df2_mod, aes(x = PC1, y = PC2, 
                           colour = Treatment, 
                           label = Treatment)) + 
        geom_text() + 
        stat_ellipse(show.legend = FALSE)
    

    enter image description here