【问题标题】:PCA error infinite or missing values in 'x''x' 中的 PCA 错误无限或缺失值
【发布时间】:2014-07-29 19:46:29
【问题描述】:

我一直在努力使用 R 来分析财务数据。总的来说,我是编程新手,真的,除了非常习惯在 Excel 中工作。因此,我花了很多时间(可能太多时间)格式化我的 CSV 文件,只是为了尽量减少在 R 中工作时的麻烦,但这并没有奏效。

这是我的 PCA 分析代码。当我使用没有 N/As 或空白的较小数据文件时,我才让它工作,但我需要知道如何在 R 中处理这些。

returns <- read.csv("PCA Data File.csv", skip = 1, header = T)
#standardize the variables
returns.pca <- prcomp(returns[2:ncol(returns)], scale = TRUE)

结果是:

svd(x, nu = 0) 中的错误:“x”中的值无限或缺失

由此引发了许多问题,首先是您如何解决这个问题?其次,我如何探索我的数据以确保正确处理或替换缺失值?是不是我的数据是导致问题的 data.frame 而不是矩阵?

我不确定如何附加 CSV 文件,但这里是文件的前几行(共有 241 行):

Date    Returns Var1    Var2    Var3    Var4    Var5    Var6    Var7    Var8    Var9    Var10   Var11   Var12   Var13   Var14   Var15   Var16   Var17   Var18   Var19   Var20   Var21   Var22   Var23   Var24   Var25   Var26   Var27   Var28   Var29   Var30   Var31   Var32   Var33   Var34   Var35   Var36   Var37   Var38   Var39   Var40   Var41   Var42   Var43   Var44   Var45   Var46   Var47   Var48   Var49   Var50   Var51   Var52   Var53   Var54   Var55   Var56   Var57   Var58   Var59   Var60   Var61
6/30/2014   0.48    18.12   9.44    107.43  19.53   1.92    11.54   0.99    3.33    98.83   0.44    2.59    3.42    105.15  308.59  80.44   1.36    0.94    102.07  1.69    331.47  53656.02    21897.39    11022.87    23144.90    15131.80    0.59    2.70    1.35    0.58    0.33    0.25    103.38  1.67    2.59    3.42    1.75    0.10    1.09    2.00    -0.11   1.24    2.08        0.22            138780.00                                                       
5/31/2014   1.52    17.63   9.44    107.18  14.36   1.96    12.48   1.01    3.49    98.60   0.37    2.55    3.39    101.79  306.79  79.96   1.37    0.93    101.84  1.68    324.69  53122.21    21159.31    10558.07    22584.93    14343.14    0.59    2.62    1.40    0.52    0.41    0.11    103.39  1.58    2.55    3.39    1.81    0.09    1.11    1.96    -0.07   1.15    2.29        0.47    3.50    1.49    138492.00   171.04  11302.80    4322654.00  55.40   -44.39  441.59  1000.70 117.44  11.60           6.50    1.50    0.50
4/30/2014   1.07    17.40   9.45    107.11  22.93   1.96    14.20   1.02    3.49    98.24   0.40    2.69    3.52    102.03  308.63  79.85   1.38    0.93    102.51  1.67    323.24  51470.08    21660.07    10399.85    22598.44    14475.33    0.61    2.67    1.53    0.53    0.47    0.06    103.47  1.69    2.69    3.52    1.82    0.09    1.49    2.08    0.02    1.16    2.04    -4.63   0.04    3.50    1.42    138268.00   171.58  11227.50    4296049.00  54.90   -47.04  425.02  204.90  117.57  11.60       27.30   6.60    1.80    1.40
3/31/2014   0.50    17.51   9.51    106.40  25.98   1.95    14.84   1.09    3.65    98.40   0.38    2.72    3.62    100.51  303.49  79.87   1.38    0.91    102.36  1.66    316.98  47046.98    20839.70    10097.38    21980.77    14694.83    0.61    2.72    1.59    0.52    0.48    0.04    103.44  1.63    2.72    3.62    1.99    0.08    1.73    2.10    0.00    1.13    2.02        0.91    3.30    1.20    137964.00   171.47  11169.00    4226971.00  53.70   -44.18  452.77  608.80  117.39  11.70   15.10   27.30   6.80    1.60    0.20
2/28/2014   1.76    17.10   9.52    106.27  25.35   1.96    15.47   1.13    3.88    98.46   0.31    2.70    3.66    100.68  294.91  80.44   1.37    0.90    102.12  1.66    315.92  47367.89    20039.38    10048.23    22188.31    14617.57    0.60    2.74    1.66    0.44    0.44    0.01    103.45  1.50    2.69    3.66    2.16    0.07    1.82    2.10    -0.05   1.04    1.87        0.91    3.10    1.08    137761.00   169.34  11133.50    4159972.00  53.20   -42.59  383.36  -48.40  116.28  11.70       27.30   6.90    1.70    1.70

【问题讨论】:

  • 粘贴dput(head(returns, 10)) 的输出而不是当前的复制粘贴。
  • 我想我以前去过那个页面。无论如何,现在我收到此错误: prcomp.default(na.omit(returns[2:ncol(returns)]), scale = TRUE) 中的错误:无法将常量/零列重新缩放为单位方差
  • 找到另一篇解决此错误的帖子:prcomp.default 中的错误(na.omit(returns[2:ncol(returns)]), scale = TRUE) : cannot rescale a constant/zero column to unit方差更新如下:>returns.pca returns.pca

标签: r


【解决方案1】:

您的数据似乎存在某些日期缺失值的问题,因此您必须进行一些数据清理。下面的代码是一个示例,说明如何对您提供的行执行此操作。似乎只有两个日期是完整的,因此继续进行 PCA 分析没有多大意义。

我已将您从上面输入的数据加载到变量 xx 中。

 xx <- sub("\n"," ",xx)            #  delete \n in data
 xy <- unlist(strsplit(xx,split=" "))      #  change string to character vector
 start_of_new_date <- grep("[0-9]/[0-9]{2}/2014",xy)      # find start of new dates in data
 diff(start_of_new_date)                  # notice that the number of values between dates are not all 62 so some lines are missing values
 ar <- matrix(c(c("Date", xy[1:61]), xy[168:291]), nrow=3,byrow=TRUE )       # convert only complete dates, March and April, to matrix
 df <- data.frame(Date=ar[2:3,1], ar[2:3,2:62], stringsAsFactors=FALSE)      #   convert dates and data to data frame
 colnames(df) <- c("Date",ar[1,2:62])                          # make var strings column names in data frame
 df[,2:62] <- sapply(df[,2:62], as.numeric)                  # convert data columns from character to numeric
 dfs <- scale(df[,2:62])         # example only; running scale on two row data columns is meaningless since all will scale to same values

【讨论】:

  • 我只使用列 2:ncol(returns) 以便排除日期。这不应该让它与日期无关吗?
  • 抱歉,我将您帖子中的数据字符串作为返回值,而不是文件内容。您使用 read.csv 尝试将其引入但没有任何逗号,因此它不会正确分隔值。两个想法:首先,查看返回的内容,看它们是否正确。其次,再解释一下您是如何从 Excel 生成此文件的。
【解决方案2】:

Error in svd(x, nu = 0) : 0 extent dimensions 可能重复

负无穷大值可以在对数变换后替换,如下所示。

log_features <- log(data_matrix[,1:8])
log_features[is.infinite(log_features)] <- -99999

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多