Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在我使用QQ绘图结果删除现有异常值后,会出现新的异常值_R_Pca_Outliers_Mahalanobis - Fatal编程技术网

R 在我使用QQ绘图结果删除现有异常值后,会出现新的异常值

R 在我使用QQ绘图结果删除现有异常值后,会出现新的异常值,r,pca,outliers,mahalanobis,R,Pca,Outliers,Mahalanobis,我正在研究Michael Faraway的线性模型与R的PCA部分(第11章,第164页) PCA分析对异常值很敏感,马氏距离有助于我们识别它们 作者通过绘制马氏距离与卡方分布的分位数来检查异常值 if require(faraway)==F install.packages("faraway"); require(faraway) data(fat, package='faraway') cfat <- fat[,9:18] n <- nrow(cfat); p <- nc

我正在研究Michael Faraway的线性模型与R的PCA部分(第11章,第164页)

PCA分析对异常值很敏感,马氏距离有助于我们识别它们

作者通过绘制马氏距离与卡方分布的分位数来检查异常值

if require(faraway)==F install.packages("faraway"); require(faraway)
data(fat, package='faraway')
cfat <- fat[,9:18]

n <- nrow(cfat); p <- ncol(cfat)
plot(qchisq(1:n/(n+1),p), sort(md), xlab=expression(paste(chi^2,
                                                            "quantiles")),
ylab = "Sorted Mahalanobis distances")
abline(0,1)
异常值似乎位于第242:252行。我删除这些异常值并重新创建QQ图:

cfat.mod <- cfat[-c(242:252),]  #remove outliers
robfat <- cov.rob(cfat.mod)
md <- mahalanobis(cfat.mod, center=robfat$center, cov=robfat$cov)
n <- nrow(cfat.mod); p <- ncol(cfat.mod)
plot(qchisq(1:n/(n+1),p), sort(md), xlab=expression(paste(chi^2,
                                                          "quantiles")),
     ylab = "Sorted Mahalanobis distances")
abline(0,1)

identify(qchisq(1:n/(n+1),p), sort(md))

cfat.mod要正确识别点,请确保标签与数据中点的位置相对应。带有
索引的函数
order
sort
。return=TRUE
将给出已排序的索引。下面是一个示例,任意删除
md
大于阈值的点

## Your data
data(fat, package='faraway')
cfat <- fat[, 9:18]
n <- nrow(cfat)
p <- ncol(cfat)
md <- sort(mahalanobis(cfat, colMeans(cfat), cov(cfat)), index.return=TRUE)
xs <- qchisq(1:n/(n+1), p)
plot(xs, md$x, xlab=expression(paste(chi^2, 'quantiles')))

## Use indices in data as labels for interactive identify
identify(xs, md$x, labels=md$ix)

## remove those with md>25, for example
inds <- md$x > 25
cfat.mod <- cfat[-md$ix[inds], ]
nn <- nrow(cfat.mod)
md1 <- mahalanobis(cfat.mod, colMeans(cfat.mod), cov(cfat.mod))

## Plot the new data
par(mfrow=c(1, 2))
plot(qchisq(1:nn/(nn+1), p), sort(md1), xlab='chisq quantiles', ylab='')
abline(0, 1, col='red')
car::qqPlot(md1, distribution='chisq', df=p, line='robust', main='With car::qqPlot')
##您的数据
数据(fat,package='faraway')

cfat我们需要
md
进行故障排除。您可能没有做错任何事情。这是错误指定模型的常见问题。同意@Alex的说法,您正在根据排除旧异常值的“新”数据集重新计算异常值。@BrandonBertelsen“一直都是异常值”。哈哈,我从没见过。很好的类比。我喜欢海龟。
## Your data
data(fat, package='faraway')
cfat <- fat[, 9:18]
n <- nrow(cfat)
p <- ncol(cfat)
md <- sort(mahalanobis(cfat, colMeans(cfat), cov(cfat)), index.return=TRUE)
xs <- qchisq(1:n/(n+1), p)
plot(xs, md$x, xlab=expression(paste(chi^2, 'quantiles')))

## Use indices in data as labels for interactive identify
identify(xs, md$x, labels=md$ix)

## remove those with md>25, for example
inds <- md$x > 25
cfat.mod <- cfat[-md$ix[inds], ]
nn <- nrow(cfat.mod)
md1 <- mahalanobis(cfat.mod, colMeans(cfat.mod), cov(cfat.mod))

## Plot the new data
par(mfrow=c(1, 2))
plot(qchisq(1:nn/(nn+1), p), sort(md1), xlab='chisq quantiles', ylab='')
abline(0, 1, col='red')
car::qqPlot(md1, distribution='chisq', df=p, line='robust', main='With car::qqPlot')