我有一个数据框,其中包含year
变量,跨越100年。该变量最初是一个整数,但我认为将其转换为有序因子是一个好主意。
> myDf <- data.frame(year = factor(1900:1995, levels = 1900:1995, ordered = TRUE),
z = rnorm(96))
但是,当我尝试训练模型时,会产生错误。
> myFit <- lm(z ~ year, data = myDf)
Error in ctrfn(levels(x), contrasts = contrasts) :
orthogonal polynomials cannot be represented accurately enough for 95 degrees of freedom
搜索后,我只能从contr.poly
源代码中找到以下内容。
if (n > 95)
stop(gettextf("orthogonal polynomials cannot be represented accurately enough for %d degrees of freedom",
n - 1), domain = NA)
所以我然后尝试了以下方法:
> myDf2 <- data.frame(year = factor(1900:1994, levels = 1900:1994, ordered = TRUE),
z = rnorm(95))
> myFit2 <- lm(z ~ year, data = myDf2)
它不会返回错误。
因子排序的事实是否有所作为?
> myDf3 <- data.frame(year = factor(1900:1995, levels = 1900:1995, ordered = FALSE),
z = rnorm(96))
> myFit3 <- lm(z ~ year, data = myDf3)
没有错误产生。显然,是导致此错误的顺序。
我不了解在95个自由度处截止的意义,也不了解contr.poly
与lm
的关系。还是根本没有关系?为什么订购很重要?
此外,订购一个因子的水平是否像我不明智的那样?我的思考过程是我应该将year
从整数转换为有序因数,因为year不会像数据集中的其他变量(即距离)那样“缩放”。比例可能不是正确的术语,但我只是说年份变量在数据集中有矛盾,而距离却没有。