从数据框中删除完美的多线性变量

时间:2016-02-15 13:35:32

标签: r statistics stata

我有一个带变量的数据框,其中一些包含相同的信息

x1 = runif(1000)
x2 = runif(1000)
x3 = x1 + x2
x4 = runif(1000)
x5 = runif(1000)*0.00000001 +x4
x6 = x5 + x3
x = data.frame(x1, x2, x3, x4, x5, x6)

在下一步中,我想摆脱所有完全多线性的变量,例如:第x3列和第x6列(可能还有其他组合)。

在Stata中,这很简单:_rmcoll varlist

如何在R中有效地完成?

编辑: 请注意,最终目标是计算观测值之间的马哈拉诺比斯距离。为此,我需要删除冗余变量。而且据我所知,对于这个应用程序,我是否放弃x1,x2或x3

2 个答案:

答案 0 :(得分:5)

我不知道内置的便利功能,但QR分解会这样做。

我们需要数据框是一个矩阵:

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<link href="<c:url value="/resources/css/jquery.dataTables.css" />"
    rel="stylesheet">
<link href="<c:url value="/resources/demo.css" />" rel="stylesheet">

<style type="text/css" class="init">
</style>
<script type="text/javascript" language="javascript"
    src="http://code.jquery.com/jquery-1.12.0.min.js">
    </script>
<script type="text/javascript" language="javascript"
    src="<c:url value="/resources/js/jquery.dataTables.js" />">
    </script>
<script type="text/javascript" language="javascript"
    src="<c:url value="/resources/demo.js" />">
    </script>


<script type="text/javascript" language="javascript" class="init">

$(document).ready(function() {
    $('#example').DataTable( {
    /*  "ajax": '<c:url value="/resources/data/arrays.txt" />' */

            "ajax": "http://localhost:8080/SpringRestExample-1.0.0-BUILD-SNAPSHOT/rest/emp/draw",
            "processing": true,
            "serverSide": true,
            "columns": [
                { "data": "id" },
                { "data": "name" },             
                { "data": "createdDate" }
            ]
    } );
} ); 
</script>
</head>
<body>

使用略低于默认的公差来保留略微非多线性的列:

X <- as.matrix(x)

这严格回答了你的问题;您也可以使用奇异值分解(qr.X <- qr(X, tol=1e-9, LAPACK = FALSE) (rnkX <- qr.X$rank) ## 4 (number of non-collinear columns) (keep <- qr.X$pivot[seq_len(rnkX)]) ## 1 2 4 5 X2 <- X[,keep] )直接在此类数据上实现Mahalanobis距离......

答案 1 :(得分:0)

为了完整起见,我发布了迄今为止使用的快速解决方案。我认为与其他方法相比,它的表现并不差。

git commit -m 'my notes' ./name_of_file.ext