【问题标题】:R plm thinks my number vector is a factor, why?R plm 认为我的数字向量是一个因素,为什么?
【发布时间】:2016-12-13 10:16:05
【问题描述】:

使用此数据输入:

A   B   C   D
0.0513748973337 0.442624990365  0.044669941640565   12023787.0495
-0.047511808790502  0.199057057555  0.067542653775225   6674747.75598
0.250333519823608   0.0400359422093 -0.062361320324768  10836244.44
0.033600922318947   0.118359141703  0.048493523722074   7521473.94034
0.00492552770819    0.0851342003243 0.027123088894137   8742685.39098
0.02053037069955    0.0535545969759 0.06352586720282    8442677.4204
0.09050961131549    0.044871795257  0.049363888991624   7223126.70424
0.082789930841618   0.0230375009412 0.090676778601245   8974611.5623
0.06396481119371    0.0467280364963 0.128097065131764   8167179.81463

还有这段代码:

library(plm);
mydata <- read.csv("reproduce_small.csv", sep = "\t");
plm(C ~ log(D), data = mydata, model = "pooling"); # works
plm(A ~ log(B), data = mydata, model = "pooling"); # error

第二个plm 调用返回以下错误:

Error in Math.factor(B) : ‘log’ not meaningful for factors

reproduce_small.csv 包含上面粘贴的十行数据。显然,B 不是一个因素,它显然是一个数字向量。这意味着plm 认为这是一个因素。问题是“为什么?”,但更重要的是“我该如何解决这个问题?”

我尝试过的事情:

#1) mydata$B.log &lt;- log(mydata$B) 结果

Error in model.frame.default(formula = y ~ X - 1, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'X')

这本身就很奇怪,因为 A 和 B.log 的长度明显相同。

#2) plm(A ~ log(D), data = mydata, model = "pooling"); 导致与 #1 相同的错误。

#3) plm(C ~ log(B), data = mydata, model = "pooling"); 导致相同的原始错误(日志对因子没有意义)。

#4) plm(A ~ log(B + 1), data = mydata, model = "pooling"); 结果

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels
In addition: Warning message:
In Ops.factor(B, 1) : ‘+’ not meaningful for factors

#5) plm(A ~ as.numeric(as.character(log(B))), data = mydata, model = "pooling"); 导致相同的原始错误(日志对因子没有意义)。

编辑:按照建议,我将str(mydata) 的结果包括在内:

> str(mydata)
'data.frame':   9 obs. of  4 variables:
 $ A: num  0.05137 -0.04751 0.25033 0.0336 0.00493 ...
 $ B: num  0.4426 0.1991 0.04 0.1184 0.0851 ...
 $ C: num  0.0447 0.0675 -0.0624 0.0485 0.0271 ...
 $ D: num  12023787 6674748 10836244 7521474 8742685 ...

同样尝试mydata &lt;- read.csv("reproduce_small.csv", sep = "\t", stringsAsFactors = FALSE); 也没有用。

【问题讨论】:

  • 您是否尝试将其强制转换为数字?也许 read.csv 认为它是一个字符向量并从中产生了一个因素
  • 请出示str(mydata)
  • > str(mydata) 'data.frame': 9 obs。 OF 4变量:$ - $ a:num 0.05137 -0.04751 0.25033 0.25033 0.25033 0.0336 0.0493 ... $ b:num 0.4426 0.1991 0.04 0.1184 0.0851 ... $ C:NUM 0.0447 0.0675 -0.0624 $ D:NUM 12023787 6674748 10836244 7521474 8742685 ...
  • 您需要先将mydata 设为pdata.frame。您需要为数据的个人和时间维度建立一个索引。请参阅 plm 的小插图。
  • @Helix123 就是这样。您可以将其发布为答案,我会接受。谢谢!

标签: r plm


【解决方案1】:

cmets 中的 Helix123 指出 data.frame 应转换为 pdata.frame。因此,例如,这个玩具示例的解决方案是:

mydata$E <- c("x", "x", "x", "x", "x", "y", "y", "y", "y"); # Create E as an "index"
mydata <- pdata.frame(mydata, index = "E"); # convert to pdata.frame
plm(A ~ log(B), data = mydata, model = "pooling"); # now it works!

编辑: 至于“为什么”会发生这种情况,正如 Helix123 在 cmets 中指出的那样,当传递 data.frame 而不是 pdata.frame 时,plm 悄悄假设前两列是索引,并将它们转换为下的因子引擎盖。然后plm 将抛出一个无用的错误,而不是发出一个警告,指出传递的对象不是正确的类型,或者它根本没有做出假设。

【讨论】:

  • 如果您详细检查 plm,则会自动检查索引并完成检查:数据是否为 ​​pdata.frame,如果不是则创建它。但在这种情况下,它神秘地不起作用。
  • 前两列将被假定为索引变量(这些将被转换为因子),请参阅 ?pdata.frame
猜你喜欢
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2016-01-12
相关资源
最近更新 更多