【问题标题】:Extracting PCA axes for further analysis提取 PCA 轴以进行进一步分析
【发布时间】:2013-03-18 19:18:40
【问题描述】:

我正在分析有关芦苇田的数据。我测量的变量是水深、芦苇高度、芦苇密度等。由于一些变量是相关的,我执行了 PCA 以将这些变量减少到 2 个 PCA 轴 (N=104)。

为了执行 PCA,我在 R 中使用了 vegan 包。我的数据如下所示:

row.names   Waterpeil   hoogte_max  Som Leeftijd_riet   PFD oppervlakte onderlaag_num   afst_rand
1   1   5   2.5 51  0.15686274  1.616921    8.127192    2   24.154590
2   3   9   2.5 44  0.13636364  1.564643    9.023642    2   8.349288
3   4   0   2.5 84  0.30952381  1.352548    8.498775    2   26.226896
4   5   0   3.5 58  0.43103448  1.384183    9.301617    1   57.320000
5   6   40  2.5 52  0.42307692  1.361262    10.316058   1   45.470000
6   7   5   3.0 19  0.00000000  1.429287    9.927788    1   36.720000
7   9   0   2.5 64  0.28125000  1.355100    8.029911    2   19.560000
8   11  120 3.5 29  0.03448276  1.336117    11.147484   1   252.630000
9   14  0   2.0 27  0.07407407  1.847756    7.445060    2   1.864342
10  16  20  2.5 57  0.24561404  1.582308    8.425177    2   9.490196
11  17  5   3.0 54  0.01851852  1.348305    9.315008    2   15.960000
12  18  0   1.5 5   1.00000000  1.643657    8.063648    2   6.526300
13  21  0   2.0 18  0.05555556  1.394964    8.752185    2   37.576955
14  22  20  2.0 48  0.16666667  1.617045    8.911028    1   11.592383
15  25  0   2.5 71  0.42253521  1.749114    7.271499    2   6.572772
16  26  0   2.0 50  0.30000000  1.464582    7.349908    2   9.849276
17  27  5   2.5 61  0.34426229  1.511217    8.379012    2   14.082827
18  28  5   2.0 123 0.06504065  1.538188    8.271017    2   11.658142
19  29  100 3.0 75  0.44000000  1.896483    7.968603    1   9.071897
20  30  100 3.0 95  0.55789474  1.768147    8.367626    1   2.300783
21  32  0   3.0 74  0.45945946  1.458793    9.453464    2   57.210000
22  33  15  3.0 66  0.24242424  1.572704    7.620507    1   8.700000
23  34  5   3.0 83  0.38554217  1.436063    11.636262   1   50.613265
24  35  5   2.5 58  0.31034483  1.313440    9.370347    2   52.605041
25  36  20  2.5 91  0.28571429  1.544032    8.451961    1   9.713351
26  37  10  2.5 34  0.23529412  1.524725    9.348687    2   6.920026
27  38  20  2.5 48  0.41666667  1.584892    7.780915    1   11.302639
28  39  40  2.5 51  0.15686274  1.535552    6.994035    1   18.999423
29  40  35  2.5 48  0.45833333  1.460579    9.073331    1   12.869075
30  41  5   3.0 58  0.43103448  1.747669    7.628542    2   3.860225
31  42  25  2.5 36  0.52777778

我已经这样做了,这是前两个轴的输出:

y<-rda(nestendca2) 
summary(y)
               PC1       PC2    
Waterpeil     13.816422 -2.312641
hoogte_max     0.094747 -0.014497 
Som            2.955029 10.812549  
Leeftijd_riet  0.016476  0.019629  
PFD            0.007361 -0.003386  
oppervlakte    0.052943  0.039657 

现在我想在逻辑回归中实现这两个轴,将其与在这些领域繁殖的猛禽的繁殖成功联系起来。

我该怎么做?

【问题讨论】:

标签: r pca lm


【解决方案1】:

我也在使用 vegan 的 rda。

我尝试了@JT85 建议的 PCA3$CA$v.eig,返回 NULL

应该是 v 而不是 v.eig。像这样为我工作

data.rda <- rda(data)
data.rda.coord <- as.data.frame(data.rda$CA$v[,1:2])

【讨论】:

    【解决方案2】:

    如果您使用 princomp 包,您可以像这样提取负载:

    PCA <- princomp(data,cor=T)
    PCA 
    PCA$loadings
    Loadings <- as.data.frame(PCA$loadings[,1:2])
    

    如果你使用 prcomp 你可以这样做:

    PCA2 <- prcomp(data)
    Loadings <- as.data.frame(PCA2$rotation[,1:2])
    

    如果您使用素食主义者:

    PCA3 <- rda(data)
    Loadings <- as.data.frame(PCA3$CA$v.eig[,1:2])
    

    【讨论】:

    • 我已经编辑了我的问题并添加了我的部分数据。我正在使用 vegan 包,我忘了提。
    【解决方案3】:

    假设您在 R 中使用 prcomp。这是一种方法

    pca <- prcomp(~ Murder + Rape + Assault, data = USArrests, scale = TRUE)
    
    (loadings <- pca$rotation)
    
    ##              PC1      PC2      PC3
    ## Murder  -0.58260  0.53395 -0.61276
    ## Rape    -0.53938 -0.81798 -0.19994
    ## Assault -0.60798  0.21402  0.76456
    
    axes <- predict(pca, newdata = USArrests)
    head(axes, 4)
    
    ##               PC1      PC2       PC3
    ## Alabama  -1.19803  0.83381 -0.162178
    ## Alaska   -2.30875 -1.52396  0.038336
    ## Arizona  -1.50333 -0.49830  0.878223
    ## Arkansas -0.17599  0.32473  0.071112
    

    如果您愿意,现在可以在逻辑回归中使用这些新列(轴)。我将向您展示一个使用简单线性模型的示例。

    dat <- cbind(USArrests, axes)
    lm(UrbanPop ~ PC1 + PC2, data = dat)
    
    ## Call:
    ## lm(formula = UrbanPop ~ PC1 + PC2, data = dat)
    
    ## Coefficients:
    ## (Intercept)          PC1          PC2  
    ##       65.54        -2.58        -7.71
    

    【讨论】:

    • 你好。谢谢您的回答。我正在使用“vegan”包,但在使用我的 PC 加载创建数据框之后
    • @dickoa 为什么你使用预测?不会像上面那样使用 Loadings
    猜你喜欢
    • 2019-08-22
    • 2019-03-31
    • 2013-04-07
    • 2012-03-03
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    相关资源
    最近更新 更多