【问题标题】:CVlm with categorical variables: factor has new levels带有分类变量的 CVlm:因子有新的水平
【发布时间】:2015-02-02 08:57:49
【问题描述】:

我使用 lm 进行 MLR 和 CVlm 进行交叉验证。我的数据包含两个分类变量(其中一个有 11 个级别,另一个只有 2 个)。使用 lm 时一切似乎都正常,问题是当我尝试使用 CVlm 时。由于因素水平,我有错误。我读了一些关于这个的帖子,虽然我不太了解(对于 CVlm,我使用的数据与 CVlm 相同,所以我不知道为什么会出现这个错误以及如何处理它)。这是我的数据样本:

      dput(head(data))
      structure(list(LagO3 = c(35.0092884462795, 37.7681232441784, 
      31.9993881550014, 32.5950690475087, 37.2233826323784, 42.531864470374
      ), Z = c(165.252173124639, 166.145467346544, 161.857655081398, 
      177.043656853793, 200.269306623339, 207.772978087346), RH = c(86.4605102539062, 
      93.2499008178711, 87.1677398681641, 81.0183639526367, 74.1963653564453, 
      78.7728729248047), SR = c(310.165555555556, 343.304444444444, 
      329.844444444444, 299.145555555556, 319.321111111111, 327.731111111111
      ), ST = c(320.032313368056, 286.879364149306, 295.939059244792, 
      319.065705295139, 316.955619574653, 297.229990234375), TC = c(0.0362091064453125, 
      0.171852111816406, 0.607879638671875, 0.770919799804688, 0.553321838378906, 
      0.04547119140625), Tmx = c(289.281782049361, 289.283827735997, 
      289.913899219804, 288.649664878918, 289.756381348852, 290.302579680594
      ), Wd = c(11.0027627927081, 2.83403791472211, 3.69153840122015, 
      6.65367358341413, 4.17920155713043, 5.35254406830185), CWT = structure(c(1L, 
      9L, 5L, 4L, 4L, 4L), .Label = c("A", "C", "E", "N", "NE", "NW", 
      "S", "SW", "U", "W"), class = "factor"), LW = structure(c(1L, 
      2L, 2L, 2L, 2L, 1L), .Label = c("0", "LW"), class = "factor"), 
      o3 = c(37.7681232441784, 31.9993881550014, 32.5950690475087, 
      37.2233826323784, 42.531864470374, 48.3496367346306)), .Names = c("LagO3", 
      "Z", "RH", "SR", "ST", "TC", "Tmx", "Wd", "CWT", "LW", "o3"), row.names = c(NA, 
      6L), class = "data.frame")

这将是我的模型:

   model<-  lm(formula = o3 ~ LagO3 + Z + RH + ST + TC + Tmx + Wd + CWT, 
       data = data, na.action = na.exclude)

当我尝试做简历时:

      cvlm.mod <- CVlm(na.omit(data),model,m=10)

我有错误:

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
  factor CWT has new levels S

data$CWT 有等级:levels(data$CWT) [1] “A” “C” “E” “N” “NE” “NW” “S” “SW” “U” “W”

我发现错误可能会发生,因为 data$CWT=="S" 仅发生一次(在数据的 920 次观察中)...所以我的猜测是由于该错误而出现错误,因为添加一个data$CWT 中“S”的更多价值,CVlm 工作正常。但是,我仍然卡住了,我不知道我该如何处理这种情况。

再次感谢!!!

【问题讨论】:

  • 在您的数据中有不在“CWT”中的级别。降级后试试droplevels(data)
  • 我试过了..但它不起作用..实际上我不太确定您的评论“在您的数据中有不在“CWT”中的级别”? data$CWT 包含(现在)10 个级别..这就是为什么我对您的评论(和错误)感到困惑...无论如何,非常感谢您的建议!
  • 我的意思是在 dput 输出中,unique(data$CWT) #[1] A U NE N #Levels: A C E N NE NW S SW U W 可能是您的原始数据具有所有级别。最好发布一个模仿原始示例的示例。
  • 我想要那个...但是我有太多数据:( ..这就是为什么我只放了头...对不起:(

标签: r statistics linear-regression


【解决方案1】:

这是交叉验证中折叠之间的因子变量具有不同级别的典型问题。该算法为训练集创建了虚拟变量,但测试集与训练集具有不同的级别,因此误差也不同。解决方案是自己创建虚拟变量,然后使用CVlm 函数:

解决方案

dummy_LW <- model.matrix(~LW, data=df)[,-1]    #dummy for LW
dummy_CWT <- model.matrix(~CWT, data=df)[,-1]  #dummies for CWT
df <- Filter(is.numeric,df)                    #exclude LW and CWT from original dataset
df <- cbind(df,dummy_LW,dummy_CWT)             #add the dummies instead

然后像你一样运行模型(确保添加新的变量名):

model<-  lm(formula = o3 ~ LagO3 + Z + RH + ST + TC + Tmx + dummy_LW + 
                           CWTC + CWTE + CWTN + CWTNE + CWTNW + CWTS + 
                           CWTSW + CWTU + CWTW, 
            data = df, na.action = na.exclude)
cvlm.mod <- CVlm(na.omit(data),model,m=10)

很遗憾,我无法测试上述内容,因为您的代码行数太少(只有 6 行不够),但上述内容可以工作。

关于model.matrix的几句话:

它为分类数据创建虚拟变量。默认情况下,将一个级别作为参考级别(应该如此),因为否则您将在假人之间获得 1 的相关性。上面代码中的[,-1] 只是删除了不需要的 1 列的截距。

【讨论】:

  • 嗨!多谢!!似乎它正在工作:),但是,我有一个问题(对不起,如果它太基本了,但我从那个开始)。到目前为止,我使用 CWT 和 LW 作为一个因素,因为它们是分类的......那么如果我将更改变成一个虚拟对象(如示例中所示),我会期待类似的结果,对吗?我的意思是,将因子用于分类变量(而不是创建“假人”)也是正确的,我看到了使用 CVgam 或 CVlm 时创建假人的优势......再次感谢您的帮助!
  • 即使你没有像上面那样明确地创建假人,lm 函数也会在内部使用model.frame 创建那些假人。所以,它是完全一样的。我总是觉得自己计算会更好,因为我觉得我在控制之中。无论您使用上述方法还是仅使用lm 中的因子,结果都将完全相同(考虑到参考水平,即遗漏的水平相同)。
  • 我希望这现在有意义并且很高兴能提供帮助:)
  • 太棒了!乐于助人:)
  • 关于参考级别,我还有一个问题(对不起,我想更好地理解它是如何工作的)..这是否意味着我会丢失有关一级的信息,即参考一级? ? (即我看到摘要模型从不包含第一级 - 例如,输入“A”,然后我想知道我在拟合模型时是否丢失了这些信息,我错了吗??这有意义吗?谢谢再次寻求帮助!
猜你喜欢
  • 2014-04-14
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 2013-10-08
  • 2017-05-23
  • 1970-01-01
  • 2017-10-20
  • 2020-07-04
相关资源
最近更新 更多