我在R中使用平滑样条函数,但我收到警告信息:
> boneMaleSmooth = smooth.spline( bone[males,"age"], bone[males,"spnbmd"], cv=TRUE)
Warning message:
In smooth.spline(bone[males, "age"], bone[males, "spnbmd"], cv = TRUE) :
cross-validation with non-unique 'x' values seems doubtful
> boneFemaleSmooth = smooth.spline( bone[females,"age"], bone[females,"spnbmd"], cv=TRUE)
Warning message:
In smooth.spline(bone[females, "age"], bone[females, "spnbmd"], :
cross-validation with non-unique 'x' values seems doubtful我在某个地方读到的,说这不重要。但我不知道是什么原因造成的。希望有人能帮我。
发布于 2014-05-25 03:50:07
这意味着您有一些共享x值的数据点。在大多数情况下,它不应该对实际结果产生太大的影响。然而,使用cv=F是处理此类数据的更好方法。
它背后的原因是在smooth.spline代码中,它计算出x-值的总数:
n <- length(x)然后它开始处理您的数据(我已经包括了注释):
xx <- round((x - mean(x))/tol) #normalise the data
nd <- !duplicated(xx) #get rid of duplicated x values! THIS IS PART OF THE WARNING
ux <- sort(x[nd]) #Sort the data
nx <- length(ux) $Get the length of processed data to work with然后,如果nx
if (CV && nx < n) #CV is based on the input parameter `cv`
warning("cross-validation with non-unique 'x' values seems doubtful")发布于 2014-05-25 03:51:54
设置'cv=TRUE‘就像你所做的那样,使用了“普通”交叉验证,它使用了一种独占式的验证策略。当您复制了x值时,这个策略就不那么有用了。
当您复制了x值时,建议使用cv=FALSE来触发“广义”交叉验证。参见?smooth.spline中的讨论
发布于 2014-05-25 03:51:38
您的bone[males,"age"]向量是否包含重复的值?如果是这样的话,我认为这就是警告的来源。smooth.spline试图通过忽略一个交叉验证来确定最优的平滑平滑参数。如果遗漏的东西有重复,那么cv就有点奇怪了,所以它会发出警告。
详情请参见http://stat.ethz.ch/R-manual/R-patched/library/stats/html/smooth.spline.html。
避免这种情况的一种方法是在调用spar时指定自己的smooth.spline值,并对其进行调整,直到得到对您有意义的东西。在大多数情况下,忽略一个交叉验证可能不会导致问题。另一种方式,也许,避免警告是稍微抖动你的x-值。
更新:根据@MrFlick的回答,似乎建议在帮助文件中使用通用交叉验证(cv = FALSE)。这句话有点不透明:
当x中存在重复点时,“广义”交叉验证方法将正确工作。然而,保留一次交叉验证方法与重复点的含义是不明确的,内部代码使用的近似方法是省略重复点组。在这种情况下,最好避免使用cv = TRUE。
https://stackoverflow.com/questions/23851705
复制相似问题