【问题标题】:nls() R-function works fine in R Studio but not in SQL Server 2016nls() R 函数在 R Studio 中运行良好,但在 SQL Server 2016 中运行良好
【发布时间】:2016-12-01 22:59:56
【问题描述】:

我是使用 R Services 的 SQL Server 的新手,我正在尝试在存储过程中实现 nls() 函数,以便找到描述 SP 返回的数据的最佳拟合曲线。以下带有特定参数的 nls() 函数在 R Studio 中正常工作,但相反,在 SQL Server 的存储过程中尝试运行它时会出错。请记住,我在 R Studio 中加载的数据集与在存储过程中使用的 Select 语句的结果相同。

存储过程:

DROP TABLE IF EXISTS #TempTable

CREATE TABLE #TempTable (x NVARCHAR(MAX), y NVARCHAR(MAX))
INSERT INTO #TempTable
EXEC    [dbo].[proc_ReturnDataForCurveGraphsDoubleNorm]
    @sRAWFILEID = N'5542', @PREBLEACHVALUES = 50, @BLEACHVALUES = 1, @INITIALBLEACHVALUES = 0

execute sp_execute_external_script    
   @language = N'R'   
  ,@script = N'
    df <- as.data.frame(c(InputDataSet));
    xdata <- df[,1];
    ydata <- df[,2];
    m = nls(y ~ yo - a*exp(-b*x), data = df, start = list(yo = 0.5, a = 0.563, b = 0.9), trace = F, control = list(maxiter = 1000), lower = list(0, 0, 0),upper = list(100, 100, 1), algorithm = "port");
    OutputDataSet <- data.frame(xdata, ydata);'    
   ,@input_data_1 = N' SELECT * FROM #TempTable;'  
    WITH RESULT SETS (([x] NVARCHAR(MAX), [y] NVARCHAR(MAX) ));

我得到的错误: An external script error occurred: Error in numericDeriv(form[[3L]], names(ind), env, ifelse(internalPars &lt; : Missing value or an infinity produced when evaluating the model

在 R Studio 中正确执行的代码行如下:

m = nls(y ~ yo - a*exp(-b*x), data = df, start = list(yo = 0.5, a = 0.563, b = 0.9), trace = F, control = list(maxiter = 1000), lower = list(0, 0, 0),upper = list(100, 100, 1), algorithm = "port");

这也是数据的一种风格(总共 400 行):

         x        y
1    2.692 0.163956
2    2.744 0.222050
3    2.795 0.261590
4    2.847 0.312176
5    2.898 0.335091
6    2.950 0.365475
7    3.002 0.389842
8    3.053 0.422475
9    3.105 0.446906
10   3.157 0.464013
11   3.209 0.479566
12   3.260 0.508908
13   3.312 0.503733
14   3.364 0.521298
15   3.416 0.538741
16   3.468 0.557562
17   3.520 0.562461
18   3.572 0.578120
19   3.624 0.607666
20   3.676 0.623594
21   3.728 0.625253
22   3.779 0.620704
23   3.831 0.629850
24   3.882 0.645155
25   3.934 0.660781
26   3.986 0.667858
27   4.038 0.685587
28   4.090 0.662437
29   4.142 0.672041
30   4.194 0.683506
31   4.245 0.708125
32   4.297 0.700848
33   4.349 0.692869
34   4.401 0.735460
35   4.453 0.715026
36   4.505 0.743622
37   4.557 0.728900
38   4.609 0.732680
39   4.661 0.737960
40   4.712 0.746198
41   4.764 0.752706
42   4.816 0.754294
43   4.867 0.772323
44   4.919 0.753392
45   4.970 0.776535
46   5.022 0.769763
47   5.074 0.793794
48   5.126 0.803506
49   5.177 0.803348
50   5.229 0.786406
....
....
380 22.362 0.936958
381 22.414 0.943523
382 22.466 0.945731
383 22.518 0.945423
384 22.570 0.924267
385 22.622 0.913668
386 22.674 0.938850
387 22.726 0.922154
388 22.778 0.927627
389 22.830 0.942964
390 22.882 0.941946
391 22.934 0.928719
392 22.986 0.954385
393 23.038 0.954852
394 23.089 0.937320
395 23.142 0.939765
396 23.194 0.936664
397 23.246 0.932192
398 23.297 0.931064
399 23.349 0.929592
400 23.402 0.936149

我真的很想知道 SQL ServerR Studio 避免的问题是什么。

【问题讨论】:

  • 你有一个通过这种方法工作的 lm 模型的例子吗?我无法判断问题是特定于 nls 还是您从 sql 到 R 的连接。我怀疑 R Studio 是否避免了任何问题,您可以在 R 本身中运行相同的代码以查看 R Studio 是否有所作为。
  • 如果我在不调用 nls 函数的情况下运行存储过程,则脚本运行正常(实际上返回了 select 语句的输出)。那么这不是说明 SQL Server 和 R 之间的连接是正常的吗?
  • 您似乎错过了评论的重点。你能在 SQL 代码中用 R 做一些简单的事情吗?在你证明之后,它可能与 nls 具体有关。否则就是 SQL-R 桥接语法的问题。
  • 确实,你是对的。问题位于 SQL 内部的 R 引擎中。我尝试了简单的 max() 和 min() 函数,但都失败了。为了弄清楚发生了什么,我必须遵循一些标准步骤吗?
  • 您可能会考虑澄清您的帖子标题并修改问题陈述。据我们所知,您没有 nls 问题。您有一个更基本的 R SQL 问题。我没有像您尝试那样通过 SQL 运行 R,您的标题可能没有引起正确用户组的注意。提出类似“SQL Server R 问题:需要基本帮助”的建议

标签: r stored-procedures rstudio sql-server-2016 nls


【解决方案1】:

在 sp_execute_external_script 中用作 input_data_1 参数的 SQL 表 (#TempTable) 正在对列使用 NVARCHAR(max) 数据类型。 SQL 类型中的 NVARCHAR 映射到 R 中的 character 类型,默认情况下数据框会将字符串视为 factor 类型。要将数据作为数字类型传递给 R,您需要使用相应的 SQL 数据类型。

请参阅Data Types (Transact-SQL)Working with R Data Types 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多