具有分类变量的 CVlm:因子具有新水平
CVlm with categorical variables: factor has new levels
我正在使用 lm 进行 MLR 和 CVlm 进行交叉验证。我的数据包含两个分类变量(其中一个有 11 个级别,另一个只有 2 个级别)。使用 lm 时一切似乎都正常,问题是当我尝试使用 CVlm 时。由于因子水平,我有错误。我读了一些 post 的内容,虽然我不太了解(对于 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 工作正常。但是,我仍然卡住了,我不知道如何处理这种情况。
再次感谢!!!
这是交叉验证中折叠之间的因子变量具有不同水平的典型问题。该算法为训练集创建虚拟变量,但测试集与训练集具有不同的级别,因此具有不同的错误。解决方案是自己创建虚拟变量,然后使用 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 列的截距。
我正在使用 lm 进行 MLR 和 CVlm 进行交叉验证。我的数据包含两个分类变量(其中一个有 11 个级别,另一个只有 2 个级别)。使用 lm 时一切似乎都正常,问题是当我尝试使用 CVlm 时。由于因子水平,我有错误。我读了一些 post 的内容,虽然我不太了解(对于 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 工作正常。但是,我仍然卡住了,我不知道如何处理这种情况。
再次感谢!!!
这是交叉验证中折叠之间的因子变量具有不同水平的典型问题。该算法为训练集创建虚拟变量,但测试集与训练集具有不同的级别,因此具有不同的错误。解决方案是自己创建虚拟变量,然后使用 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 列的截距。