2016-05-17 117 views
3

我想知道如何計算兩個橢圓之間的交點,例如如圖所示該圖中雲芝和virginca之間的交點的體積: PCA on iris dataset ,其使用基於此tutorial以下兆瓦繪製:如何計算r中橢圓交點的體積

data(iris) 
log.ir <- log(iris[, 1:4]) 
ir.species <- iris[, 5] 
ir.pca <- prcomp(log.ir, center = TRUE, scale. = TRUE) 

library(ggbiplot) 
g <- ggbiplot(ir.pca, obs.scale = 1, var.scale = 1, 
      groups = ir.species, ellipse = TRUE, 
      circle = TRUE) 
g <- g + scale_color_discrete(name = '') 
g <- g + theme(legend.direction = 'horizontal', 
      legend.position = 'top') 
print(g) 

我得到爲橢圓的協方差和中心如下:

setosa.cov <- cov(ir.pca$x[ir.species=="setosa",]) 
versicolor.cov <- cov(ir.pca$x[ir.species=="versicolor",]) 
virginica.cov <- cov(ir.pca$x[ir.species=="virginica",]) 
setosa.centre <- colMeans(ir.pca$x[ir.species=="setosa",]) 
versicolor.centre <- colMeans(ir.pca$x[ir.species=="versicolor",]) 
virginica.centre <- colMeans(ir.pca$x[ir.species=="virginica",]) 

但是,然後我在我的智慧結束: - |

編輯: 繼@下面卡爾witthoft,這裏的例子使用SIAR ::重疊的適應症:

library(siar) 
setosa <- ir.pca$x[ir.species=="setosa",] 
versicolor <- ir.pca$x[ir.species=="versicolor",] 
virginica <- ir.pca$x[ir.species=="virginica",] 

overlap.fun <- function(data.1, data.2){ 
    dimensions <- ncol(data.1) 
    for(i in 1:(dimensions-1)){ 
     overlap.out <- overlap(data.1[,i], data.1[,i+1], data.2[,i], data.2[,i+1], steps = 5) 
     out$overlap[i] <- overlap.out$overlap 
     out$area1[i] <- overlap.out$area1 
     out$area2[i] <- overlap.out$area2 
    } 
    return(out) 
} 

overlap.fun(versicolor, virginica) 

回報:

$overlap 
[1] 0.01587977 0.48477088 0.08375927 
$area1 
[1]1.020596 1.04614461 0.08758691     
$area2 
[1] 1.028594 1.1535106 0.1208483 

奇怪的是當我做了百分比計算的值並不真正對應於ggbiplot PCA中的橢球:

tmp <- overlap(versicolor[,1], versicolor[,2], virginica[,1], virginica[,2], steps = 5) 
virginica.percentage <- round(x=(tmp$overlap/tmp$area2*100), digits = 2) 
versicolor.percentage <- round(x=(tmp$overlap/tmp$area1*100), digits = 2) 
> virginica.percentage [1] 1.54 
> versicolor.percentage[1] 1.56 

這比上面的圖1中所示的要小得多。 但是可能更好的在這個here上打開另一個線程。

+0

基本的方法是找到相交點,計算「上」和「下」曲線的積分,並取距離,您需要將其分開以確保每個積分超過單值d功能範圍。也就是說,我似乎記得在CRAN上有一兩個包含這種相交面積計算的軟件包。當然我不記得哪些:-( –

回答

4

可能的工具:

spatstat::overlap.owin , geo::geointersect, siar::overlap . 

你可能會問 - 你應該問 - 「他是怎麼得到這些問題的答案這麼快

獲取你的包sos並鍵入???overlap

+0

非常感謝你的光速答案! 我試過siar :: overlap,因爲它對我來說是最容易理解的 'library(siar)' ' versicolor < - ir.pca $ x [ir.species ==「versicolor」,]' 'virginica < - ir.pca $ x [ir.species ==「virginica」,]' 'overlapping(versicolor [,1 ],$ versicolor [,2],virginica [,1],virginica [,2],steps = 5)' 返回: '$ overlap' '[1] 0.01587977' '$ area1' ' 1.020596' '$ area2' '[1] 1.028594' – raumkundschafter

+0

@sesselastronaut。很高興有效 - 如果它完全滿足您的需求,請將答案標記爲「已接受」。 –

+0

@ carl-wittcroft對於示例中顯示的前兩臺個人計算機而言確實如此。我想知道如何在源自虹膜數據集上的pca的所有四個主要組件上做到這一點?將它們全部比較並添加它們? – raumkundschafter