- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个具有 95%“精确”置信椭圆的二元正态分布散点图。
library(mvtnorm)
library(ggplot2)
set.seed(1)
n <- 1e3
c95 <- qchisq(.95, df=2)
rho <- 0.8 #correlation
Sigma <- matrix(c(1, rho, rho, 1), 2, 2) # Covariance matrix
我从均值为零且方差=Sigma
的二元正态分布生成了 1000 个观测值
x <- rmvnorm(n, mean=c(0, 0), Sigma)
z <- p95 <- rep(NA, n)
for(i in 1:n){
z[i] <- x[i, ] %*% solve(Sigma, x[i, ])
p95[i] <- (z[i] < c95)
}
我们可以使用 stat_ellipse
轻松在生成数据的散点图顶部绘制 95% 置信度椭圆。得到的数字是完全令人满意的,直到您注意到几个红点位于置信椭圆内。我猜这种差异来自于一些参数的估计,并且随着样本量的增大而消失。
data <- data.frame(x, z, p95)
p <- ggplot(data, aes(X1, X2)) + geom_point(aes(colour = p95))
p + stat_ellipse(type = "norm")
有什么方法可以微调stat_ellipse()
,使其描绘出“精确”的置信椭圆,如下图所示,该椭圆是使用“手工制作”ellips<创建的
功能?
ellips <- function(center = c(0,0), c=c95, rho=-0.8, npoints = 100){
t <- seq(0, 2*pi, len=npoints)
Sigma <- matrix(c(1, rho, rho, 1), 2, 2)
a <- sqrt(c*eigen(Sigma)$values[2])
b <- sqrt(c*eigen(Sigma)$values[1])
x <- center[1] + a*cos(t)
y <- center[2] + b*sin(t)
X <- cbind(x, y)
R <- eigen(Sigma)$vectors
data.frame(X%*%R)
}
dat <- ellips(center=c(0, 0), c=c95, rho, npoints=100)
p + geom_path(data=dat, aes(x=X1, y=X2), colour='blue')
最佳答案
原始问题中提出的椭圆代码是错误的。当 X1 和 X2 变量的平均值为 0、标准差为 1 时,它起作用,但在一般情况下不起作用。
这是一个替代实现,改编自 stat_ellipse源代码。它将均值向量、协方差矩阵、半径(例如用置信度计算)和形状的分段数作为参数。
calculate_ellipse <- function(center, shape, radius, segments){
# Adapted from https://github.com/tidyverse/ggplot2/blob/master/R/stat-ellipse.R
chol_decomp <- chol(shape)
angles <- (0:segments) * 2 * pi/segments
unit.circle <- cbind(cos(angles), sin(angles))
ellipse <- t(center + radius * t(unit.circle %*% chol_decomp))
colnames(ellipse) <- c("X1","X2")
as.data.frame(ellipse)
}
让我们比较一下这两种实现:
library(ggplot2)
library(MASS) # mvrnorm function, to sample multivariate normal variables
set.seed(42)
mu = c(10, 20) # vector of means
rho = -0.7 # correlation coefficient
correlation = matrix(c(1, rho, rho, 1), 2) # correlation matrix
std = c(1, 10) # vector of standard deviations
sigma = diag(std) %*% correlation %*% diag(std) # covariance matrix
N = 1000 # number of points
confidence = 0.95 # confidence level for the ellipse
df = data.frame(mvrnorm(n=N, mu=mu, Sigma=sigma))
radius = sqrt(2 * stats::qf(confidence, 2, Inf)) # radius of the ellipse
ellips <- function(center = c(0,0), c=c95, rho=-0.8, npoints = 100){
# Original proposal
t <- seq(0, 2*pi, len=npoints)
Sigma <- matrix(c(1, rho, rho, 1), 2, 2)
a <- sqrt(c*eigen(Sigma)$values[2])
b <- sqrt(c*eigen(Sigma)$values[1])
x <- center[1] + a*cos(t)
y <- center[2] + b*sin(t)
X <- cbind(x, y)
R <- eigen(Sigma)$vectors
data.frame(X%*%R)
}
calculate_ellipse <- function(center, shape, radius, segments){
# Adapted from https://github.com/tidyverse/ggplot2/blob/master/R/stat-ellipse.R
chol_decomp <- chol(shape)
angles <- (0:segments) * 2 * pi/segments
unit.circle <- cbind(cos(angles), sin(angles))
ellipse <- t(center + radius * t(unit.circle %*% chol_decomp))
colnames(ellipse) <- c("X1","X2")
as.data.frame(ellipse)
}
ggplot(df) +
aes(x=X1, y=X2) +
theme_bw() +
geom_point() +
geom_path(aes(color="new implementation"), data=calculate_ellipse(mu, sigma, radius, 100)) +
geom_path(aes(color="original implementation"), data=ellips(mu, confidence, rho, 100))
关于r - 在 ggplot2 中微调 stat_ellipse(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27382145/
我有一个包含四类元音的数据集,类似于以下内容: speaker vowel_category f1 f2 1 a x x 1
您有一个包含多个组(例如 10 个)的散点图。您为各组绘制 95% 置信度椭圆。 问题:你不需要看到所有组的置信度椭圆(因为没有必要或者因为其中一些点很少,导致巨大的椭圆) 问题:如何去除确定组的置信
我想创建一个具有 95%“精确”置信椭圆的二元正态分布散点图。 library(mvtnorm) library(ggplot2) set.seed(1) n <- 1e3 c95 <- qchisq
因此,我正在尝试更改从 ggplot2 中的 stat_ellipse 生成的椭圆的线型(参见此处 https://raw.github.com/low-decarie/FAAV/master/r/s
Similar to this question 当type = "norm"时,有什么方法可以计算这个椭圆的面积吗? 默认为 type = "t"。 type = "norm" 显示不同的椭圆,因为
这可能很简单,但我试图在我的 PCoA 图上围绕我的治疗绘制椭圆。 我的数据框 (sc) 是: MDS1 MDS2 Treatment X1xF1 -0.197
我是一名优秀的程序员,十分优秀!