【问题标题】:R function error, "no applicable method for 'predict' applied to an object of class "NULL"R函数错误,“没有适用于'预测'的方法应用于“NULL”类的对象
【发布时间】:2018-01-17 18:09:05
【问题描述】:

我正在尝试使用一个函数来生成一系列 KS 测试的 p 值。就我而言,我希望从我的 aaa 数据集中选择不同的前 M[i] 行,并经过几个步骤生成预测 glm 回归值 dd,最后比较每两个数据集以获得 KS 测试的 p 值。但是我的代码效果不佳。我使用模拟数据在下面附加了我的代码:

set.seed(1)
aaa <- matrix(runif(8000*950), 8000, 950)
ph = sample(rep(0:1,l=950))
kst <- function(M){
  N = length(M)
  aa = list()
  bb = list()
  cc = list()
  dd = list()
  ee = list()
  p = 0
  for (i in 2:N){
    aa[[i]] = aaa[1:M[i],] ## class(aaa) is matrix 
    bb[[i]] = rbind(ph, aa[[i]])
    cc[[i]] = as.data.frame(t(bb[[i]]))
    dd[[i]] = glm(data = cc[[i]], formula = ph~., family = binomial)
    ee[[i]] = ks.test(predict(dd[[i-1]]), predict(dd[[i]]))
    p[i] = ee[[i]]$p.value
  }
  return(p)
}
kst(M = seq(50,950,by=50))

但是R说:

> kst(M = seq(50,950,by=50))
Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to an object of class "NULL"

我认为我的 ks.test 循环也有错误,但我不知道如何修复它。 谁能帮我解决这个问题?提前致谢。

【问题讨论】:

  • 无法在没有数据的情况下进行测试,但 i in 1:N-1 看起来不对。试试1:3-1 之类的小例子,看看你的想法。

标签: r


【解决方案1】:

问题可能出在for (i in 1:N-1)

R 将1:N-1 解释为序列 1 到 N,然后从整个向量中减去 1。 试试1:5-1 看看我的意思。

试试for (i in 1:(N-1))

也在这一行

 ee[[i]] = ks.test(predict(dd[[i]]), predict(dd[[i+1]])) ## this line may also have problem.

dd[[i+1]] 尚未定义,因为您的循环仅将dd 填充到i

不确定这是您想要做的,但也许:

  if(i>1L)ee[[i]] = ks.test(predict(dd[[i-1]]), predict(dd[[i]]))

这样,在您填写了dd 的第一个条目后,您就开始测试当前的dd 与之前的对比。

【讨论】:

  • 感谢您的回答。虽然,我不知道你为什么使用 if(i >1L)?在我更改为 for (i in 1:(N-1)) 之后,R 说,没有适用于 'predict' 的方法应用于类 "NULL" 的对象。它仍然没有工作。你有什么建议吗?
  • @JINBOZHAO 正如克里斯所说,在您的predict 电话中,您有dd[[i - 1]]。当i 为 1 时,i - 1 为 0。dd[[0]] 什么都不是 - 列表以 1 而不是 0 开头。所以 R 告诉您,您无法预测任何内容。 Chris 提出了一个解决方案:仅预测 i 是否大于 1。在 R 代码中,这被转换为 if(i &gt; 1)
  • @JINBOZHAO 我添加了if 语句,原因是@Gregor 详细信息。
  • 感谢@ChrisMcCort,您的帮助非常有用。
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2017-01-10
  • 2022-12-15
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多